LeetCode221214_137、459. 重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/repeated-substring-pattern
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解一、字符串ss = s + s, 若有子串重复构成,ss中间会有新凑成的s,去掉首尾字符进行判断。

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        String ss = s + s;
        return ss.substring(1, ss.length() - 1).contains(s);
    }
}

题解二、使用kmp,若字符串由子串重复构成,则字符串-最长相等前后缀则为重复的子串。

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int len = s.length();
        int[] next = new int[len];
        getNext(next, s);
        if (next[len - 1] != 0 && len % (len - next[len -1]) == 0) {
            return true;
        }
        return false;
    }

    public int[] getNext(int[] next, String s) {
        int j = 0;
        next[0] = 0;
        for (int i = 1; i < s.length(); i++) {
            while (j > 0 && s.charAt(j) != s.charAt(i)) {
                j = next[j - 1];
            }
            if (s.charAt(i) == s.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        return next;
    }
}

你可能感兴趣的:(leetcode,算法,职场和发展)