LeetCode-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;
}
}
Either Excellent or Rusty
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了