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 @   Garrett_Wale  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示