0459-Repeated Substring Pattern
Posted 周先森爱吃素
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0459-Repeated Substring Pattern相关的知识,希望对你有一定的参考价值。
这个系列算是出于个人兴趣开的一个新坑吧,最近看到同学刷LeetCode算法题,就想写写那些可以一行Python代码写出来的题目,因此本专栏的文章的解题方式效率不做保证,只为追求“一行的浪漫”。
题目
题解
简单解释一下题目,给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。本题难度为Easy。
这题的思路很多,可以用KMP算法解决,不过,这里官方题解给了一种有趣的思路,假设重复的子串为 s ′ s\\prime s′,那么 s s s就可以写成 s ′ s ′ . . . s ′ s\\prime s\\prime ... s\\prime s′s′...s′,且每个子串 s ′ s\\prime s′的长度为 n ′ n\\prime n′,有 1 < = n ′ < n 1<= n\\prime < n 1<=n′<n,其中 n n n为 s s s的长度。因此,不妨将两个 s s s拼接到一起,此时的从第一个和最后一个 s ′ s\\prime s′中分别删除第一个和最后一个字符,由于 n ′ n\\prime n′至少为1,那么 s + s s+s s+s中一定包含原始的 s s s。这里是一个充分条件,也就是 s s s满足题意会有上述性质,至于有上述性质的一定满足题意这一结论的证明见官方题解。
代码
代码实现上其实将两个s拼接到一起并从位置1开始查询,只要查询的结果不是n就实现了从ss[1:len(ss)]
的子串搜索。
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
return (s + s).find(s, 1) != len(s)
提交的反馈如下。
以上是关于0459-Repeated Substring Pattern的主要内容,如果未能解决你的问题,请参考以下文章
spoj LCS2 - Longest Common Substring II && LCS - Longest Common Substring
LeetCode 5.Longest Palindromic Substring