📜  门| GATE-CS-2003 |第 86 题(1)

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

题目描述

给定两个字符串A和B,判断字符串B是否可以通过将A中的子串无限重复来得到。

函数签名
def is_substring_repeating(a: str, b: str) -> bool:
    pass
输入参数
  • a:字符串A
  • b:字符串B
输出参数
  • 返回一个布尔值,表示字符串B是否可以通过将A中的子串无限重复来得到。
示例
assert is_substring_repeating("abcd", "cdabcdab") == True
assert is_substring_repeating("ab", "cab") == False
解题思路

题目要求我们判断字符串B是否可以通过将A中的子串无限重复来得到,我们可以考虑找到A中的最短子串s,通过连续重复s来得到B。

我们从s的长度为1开始,逐步增加s的长度,假设当前s的长度为j,那么我们可以通过判断B中的前j个字符是否与s相等来判断是否可以通过重复s来得到前j个字符,如果不能则说明s的长度必须增加,我们将s的长度增加为j+1,然后重新进行判断,直到我们找到最短的可以重复得到B的子串s。

最后,我们将s重复直到长度等于B的长度,判断s是否等于B即可。

解题代码
def is_substring_repeating(a: str, b: str) -> bool:
    def check(s: str) -> bool:
        if len(s) == 0 or len(s) > len(b):
            return False

        bs = ""
        while len(bs) < len(b):
            bs += s

        if bs == b:
            return True

        return False

    for i in range(1, len(a) + 1):
        s = a[:i]
        if check(s):
            return True

    return False