459. 重复的子字符串
题目链接:459. 重复的子字符串
思路:
第一种解法:如果一个字符串由若干个相同的字符串组成,那么将这个字符串复制一份接入原字符串的尾部,新的字符串中一定包含原字符串(不算头尾)。
第二种解法:如果一个字符串由若干个相同的字符串组成,那么在这个字符串旋转的过程中,一定会长生与原字符串相同的字符串。定义一个新字符串 = s,当len > 0时,str = str.charAt(s.length() - 1) + str.substring(0, s.length() - 1)(模拟原字符串旋转一位),每次旋转完len--;
第三种解法:假设这个相同字符串的长度是n,那么该字符串n + 1的位置的字符跟 1 位置的字符是相同的。使用for循环,i从 1 开始,到 length / 2为止,首先判断len % i是否为0,如果不为0,那么continue。如果为0,j 为 i + 1,判断 j 和 j - i 位置的值是否相等。不想等则break。
我的代码:
// 方法一
class Solution {
public boolean repeatedSubstringPattern(String s) {
String str = s + s; return str.substring(1, str.length() - 1).contains(s);
}
}
// 方法二
class Solution {
public boolean repeatedSubstringPattern(String s) {
int len = s.length();
String str = s;
while (len > 1) {
str = str.charAt(s.length() - 1) + str.substring(0, s.length() - 1);
if (str.equals(s)) {
return true;
}
len--;
}
return false;
}
}
// 方法三
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;
}
}
总结:
KMP还是不太理解,一刷先跳过吧orz