字符串最短循环子串| 豆包MarsCode AI刷题

63 阅读2分钟

题目要求:

小M在研究字符串时发现了一个有趣的现象:某些字符串是由一个较短的子串反复拼接而成的。如果能够找到这个最短的子串,便可以很好地还原字符串的结构。你的任务是给定一个字符串,判断它是否是由某个子串反复拼接而成的。如果是,输出该最短的子串;否则,输出空字符串""。

例如:当输入字符串为 abababab 时,它可以由子串 ab 反复拼接而成,因此输出 ab;而如果输入 ab,则该字符串不能通过子串的重复拼接得到,因此输出空字符串。

测试样例:

样例一:

输入:inp = "abcabcabcabc" 输出:'abc'

样例二:

输入:inp = "aaa" 输出:'a'

样例三:

输入:inp = "abababab" 输出:'ab'

样例四:

输入:inp = "ab" 输出:''

样例五:

输入:inp = "abcdabcdabcdabcd" 输出:'abcd'

样例六:

输入:inp = "b" 输出:''

题目难度:

简单

解题语言:

python

本题思路 我们首先需要找到一个最短的子串,使得该子串重复拼接可以得到输入的字符串。 然后我们可以使用字符串操作来实现数据结构选择:

本题算法步骤: 1.遍历所有可能的子串长度(从1到字符串长度的一半)。 2.对于每个子串长度,检查是否可以通过该子串的重复拼接得到原字符串。 3.如果找到这样的子串,返回该子串;否则,返回空字符串。

代码:

def solution(inp):

for i in range(1, len(inp) // 2 + 1):
 
    substring = inp[:i]
 
    if substring * (len(inp) // len(substring)) == inp:
        return substring

return ""

if __name__ == "__main__":

print(solution("abcabcabcabc") == "abc")
print(solution("aaa") == "a")
print(solution("abababab") == "ab")
print(solution("ab") == "")
print(solution("abcdabcdabcdabcd") == "abcd")
print(solution("b") == "")

解释与思考:

// for i in range(1, len(inp) // 2 + 1):       此步骤遍历所有可能的子串长度。
//substring = inp[:i]:                         此步骤提取当前长度的子串。
//if substring * (len(inp) // len(substring)) == inp: 
此步骤检查是否可以通过该子串的重复拼接得到原字符串。
//return "":                                  此步骤为如果没有找到符合条件的子串,返回空字符串。

那么如何判断一个字符串是否由某个子串反复拼接而成?

我的思路是 首先我们需要找到一个最短的子串,使得该子串重复拼接可以得到输入的字符串。

那么如何找到这个子串?

我们可以使用字符串操作来实现,我们对于每个子串长度,均提取子串并重复拼接,检查是否等于原字符串。全部历遍所有情况即可实现