代码随想录Day10 | 459. 重复的子字符串 | KMP

112 阅读1分钟

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