LeetCode-459. 重复的子字符串

题目来源

459. 重复的子字符串

题目详情

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

示例 1:

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

示例 2:

输入: s = "aba"
输出: false

示例 3:

输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成

题解分析

解法一:KMP算法

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        return kmp(s + s, s);

    }

    private boolean kmp(String query, String pattern){
        int n = query.length();
        int m = pattern.length();
        int[] next = new int[m];
        Arrays.fill(next, -1);
        // 构造next数组
        for(int i=1; i<m; i++){
            int j = next[i-1];
            while(j != -1 && pattern.charAt(i) != pattern.charAt(j+1)){
                j = next[j];
            }
            if(pattern.charAt(i) == pattern.charAt(j+1)){
                next[i] = j+1;
            }
        }

        // 匹配主串
        int j = -1;
        for(int i=1; i<n-1; i++){// 去除头尾字符,因为本题比较特殊,主串是拼凑在一起的
            while(j != -1 && query.charAt(i) != pattern.charAt(j+1)){
                j = next[j];
            }

            if(query.charAt(i) == pattern.charAt(j+1)){
                j++;
                if(j == m-1){
                    return true;
                }
            }
        }
        return false;
    } 
}
posted @ 2022-04-02 22:06  Garrett_Wale  阅读(51)  评论(0编辑  收藏  举报