📅  最后修改于: 2023-12-03 15:37:16.188000             🧑  作者: Mango
给定一个非空字符串,判断该字符串中是否存在一个子串,使得该子串可以通过重复多次得到。
def repeatedSubstring(str: str) -> bool:
assert repeatedSubstring('abab') == True
assert repeatedSubstring('aba') == False
assert repeatedSubstring('abcabcabcabc') == True
该问题可以看作是判断字符串是否是由某一子串重复组成。可以通过以下两种方式进行求解:
首先,利用双重循环枚举所有可能的子串,时间复杂度为 $O(n^3)$。
对于每个子串,检测该子串是否可以通过该子串重复多次得到,时间复杂度为 $O(n)$,因此总时间复杂度为 $O(n^4)$。
实现代码如下:
def repeatedSubstring(str: str) -> bool:
if len(str) == 1:
return False
for i in range(len(str)-1):
for j in range(i+1, len(str)):
substring = str[i:j]
if str == substring * (len(str) // len(substring)):
return True
return False
其次,可以观察到一个重复的子串一定在字符串的前半部分出现。因此可以将原字符串复制一份,将其首尾拼接,可以得到一个长度为 $2n$ 的新字符串 $s'$。
现在问题转化为在 $s'$ 中寻找长度为 $n$ 的子串,其出现了不止一次。可以使用字符串匹配算法进行求解,时间复杂度为 $O(n)$。
实现代码如下:
def repeatedSubstring(str: str) -> bool:
if len(str) == 1:
return False
return str in (str + str)[1:-1]
本文介绍了如何判断给定字符串是否由某一子串重复多次得到。通过暴力枚举和字符串匹配两种方式进行了解释,并给出了相应的实现代码。在实际应用中建议使用字符串匹配算法,因为时间复杂度更低。