给定一个非空的字符串 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
| class Solution { public boolean repeatedSubstringPattern(String s){ int[] next = new int[s.length()]; getNext(next,s); if(next[s.length() -1] == 0){ return false; }else{ return s.length() % (s.length() - next[s.length() -1]) == 0; } } public void getNext(int[] next, String s){ int j = 0; next[0] = 0; for (int i = 1; i < s.length(); i++) { while(j > 0 && s.charAt(i) != s.charAt(j)){ j = next[j-1]; } if(s.charAt(i) == s.charAt(j)){ j++; } next[i] = j; } } }
|
法二:暴力枚举求解
双循环,i从1到n/2表示子串长度,j与j-i在i的循环内每次从i到n
如ababab,i=2时,令j=i,j与j-i同步向后遍历,若出现不同,则返回false。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public boolean repeatedSubstringPattern(String s) { int n = s.length(); for (int i = 1; i * 2 <= n; ++i) { if (n % i == 0) { boolean match = true; for (int j = i; j < n; ++j) { if (s.charAt(j) != s.charAt(j - i)) { match = false; break; } } if (match) { return true; } } } return false; } }
|