给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
字符串匹配是能够找到字符串的最大相同的前后缀的。
假设字符串s是由s1+s2组成的,s+s后,str就变成了s1+s2+s1+s2,去掉首尾,破环了首尾的s1和s2,变成了s3+s2+s1+s4,此时str中间就是s2+s1,如果s是循环字串,也就是s1=s2,所以str中间的s2+s1就和原字符串相等。如果s不是循环字串,s1!=s2,那么s1+s2是不等于s2+s1的,也就是str中间不包含s

- class Solution {
- public boolean repeatedSubstringPattern(String s) {
- int sLength = s.length();
- if(sLength <= 1) return false;
- int[] next = new int[sLength];
- for(int first = 0, last = 1; last < sLength; last++){
- while(first > 0 && s.charAt(first) != s.charAt(last)){
- first = next[first-1];
- }
- if(s.charAt(first) == s.charAt(last)){
- first++;
- }
- next[last] = first;
- }
- // 判断字符串是否由子串多次重复构成的条件:
- // 数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。
- if(next[sLength-1] != 0 && sLength % (sLength-next[sLength-1]) == 0){
- return true;
- }
- return false;
- }
- }
- class Solution {
- public boolean repeatedSubstringPattern(String s) {
- String str = s + s;
- return str.substring(1, str.length() - 1).contains(s);
- }
- }
-