部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

编程之美--3.1字符串移位包含的问题

给定啷个字符串S1和S2,要求判定S2是否能够通过S1作循环移位得到的字符串包含。
例如,给定S1=AABCD和S2=CDAA,返回true,给定S1=ABCD和S2=ACBD返回false。

解法1:对S2的每一种循环移位,都在S1中搜索是否存在子串

解法2:(空间换时间)令S=S1+S1,例如 S1=AABCD , 则S=AABCDAABCD,那么S2=CDAA可以在S内搜索到(实际上S1所有子串的循环移位都能在S内找到)

实质上利用了字符串检索KMP算法
算法详解见另一篇文章:http://www.cnblogs.com/gnivor/articles/4480338.html

我们只改变上文中的search方法,将长字符串变成原来字符串复制双份。

//搜索子串
public static int search(String mystr,String find){
    if(find.length()>mystr.length())
        return -1;
    
    int next[] = GetNextval(find);                
    String sstr = mystr+mystr;        
    int i = 0,j=0,v;
    while(i<sstr.length()&&j<find.length()){
        if(j==-1||sstr.charAt(i)==find.charAt(j)){
            i++;j++;
        }
        else j=next[j];
    }
    if(j>=find.length())
        v=i-find.length();
    else 
        v=-1;
    return v;
}

运行结果:

next数组为:-1 0 0 0
开始搜索...
字符串起始下标为:3

 

posted @ 2015-06-24 21:03  流了个火  阅读(220)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats