459.重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
1 2 3 4 5
| 输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
|
Solution
一个原理,将字符串s复制一次,创建一个新的字符串T=s+s,然后去掉T的第一个和最后一个字符,如果s仍然是T的子串,那么说明s是重复的子字符串构成
子串匹配用KMP算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution { public boolean repeatedSubstringPattern(String s) { String x=s+s; return KMP(x,s);
} public boolean KMP(String S,String T){ int i=1; int j=0; int []a=new int[T.length()+1]; Next(T,a); while(i<S.length()-1&&j<=T.length()){ if(j==-1||S.charAt(i)==T.charAt(j)){ i++; j++; }else{ j=a[j]; } if(j==T.length()){ return true; } } return false; }
public void Next(String m,int []next){ int k=-1; int j=0; next[0]=-1; while(j<m.length()){ if(k==-1||m.charAt(j)==m.charAt(k)){ j++; k++; next[j]=k; }else{ k=next[k]; } } } }
|