leetcode 459. 重复的子字符串
一、题目
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
输入: "aba"
输出: False
二、解法
暴力:
若为true,则该子串必定是前缀,且满足(i为子串长度)。小优化:由于子串重复次数至少为2,则子串长度不能超过字符串长度一半。
func repeatedSubstringPattern(s string) bool {
len:=len(s)
for i:=1;i<=len/2;i++{
if len%i==0{
match:=true
for j:=i;j<len;j++{
if s[j]!=s[j-i]{
match=false
break
}
}
if match{
return true
}
}
}
return false
}
KMP:
求出next数组后,判断
func repeatedSubstringPattern(s string) bool {
next:=buildNext(s)
len:=len(s)
return next[len-1]!=0&&len%(len-next[len-1])==0
}
func buildNext(s string) []int{
len:=len(s)
next:=make([]int,len)
for i,now:=1,0;i<len;{
if s[i]==s[now]{
next[i]=now+1
now++
i++
}else{
if now!=0{
now=next[now-1]
}else{
i++
}
}
}
return next
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了