编程之美--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

浙公网安备 33010602011771号