📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 3(1)

📅  最后修改于: 2023-12-03 15:37:16.188000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2020 |问题 3

问题描述

给定一个非空字符串,判断该字符串中是否存在一个子串,使得该子串可以通过重复多次得到。

函数签名
def repeatedSubstring(str: str) -> bool:
输入
  • 非空字符串 str (1 ≤ length(str) ≤ 10^4)
输出
  • 一个布尔值标识是否存在重复多次得到的子串
示例
assert repeatedSubstring('abab') == True
assert repeatedSubstring('aba') == False
assert repeatedSubstring('abcabcabcabc') == True
实现思路

该问题可以看作是判断字符串是否是由某一子串重复组成。可以通过以下两种方式进行求解:

方法一:Brute Force

首先,利用双重循环枚举所有可能的子串,时间复杂度为 $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]
总结

本文介绍了如何判断给定字符串是否由某一子串重复多次得到。通过暴力枚举和字符串匹配两种方式进行了解释,并给出了相应的实现代码。在实际应用中建议使用字符串匹配算法,因为时间复杂度更低。