题目分析
题目要求我们编写一个函数 solution,该函数接受一个字符串 inp 作为输入,并判断这个字符串是否可以由某个子串重复拼接而成。如果可以,输出最短的子串;如果不能,输出空字符串。
关键点分析
- 重复子串:我们需要找到一个子串,使得将这个子串重复拼接若干次后,能够得到原字符串。
- 最短子串:我们要找的是最短的那个重复子串。
- 边界条件:如果字符串本身就是一个不可再分的子串(例如
"ab"),则返回空字符串。
解题思路
-
遍历所有可能的子串:
- 我们需要遍历所有可能的子串长度,从 1 到字符串长度的一半(因为一个子串至少要重复一次)。
-
检查子串是否能整除字符串长度:
- 对于每个可能的子串长度
i,如果字符串长度n能被i整除,说明这个子串有可能是重复子串。
- 对于每个可能的子串长度
-
构建重复子串:
- 提取长度为
i的子串substring,然后将其重复拼接n // i次,得到一个新的字符串repeated_substring。
- 提取长度为
-
比较新字符串和原字符串:
- 如果
repeated_substring和原字符串inp相等,说明找到了符合条件的子串,返回这个子串。
- 如果
-
处理没有找到的情况:
- 如果遍历完所有可能的子串长度后,没有找到符合条件的子串,返回空字符串。
代码详解
Python
深色版本
def solution(inp):
n = len(inp) # 获取输入字符串的长度
# 遍历所有可能的子串长度
for i in range(1, n // 2 + 1):
# 检查子串长度是否能整除字符串长度
if n % i == 0:
substring = inp[:i] # 提取长度为 i 的子串
repeated_substring = substring * (n // i) # 将子串重复拼接 n // i 次
# 比较新字符串和原字符串
if repeated_substring == inp:
return substring # 找到符合条件的子串,返回它
return "" # 没有找到符合条件的子串,返回空字符串
# 测试用例
print(solution("abcabcabcabc")) # 输出: 'abc'
print(solution("aaa")) # 输出: 'a'
print(solution("abababab")) # 输出: 'ab'
print(solution("ab")) # 输出: ''
代码解释
-
获取字符串长度:
Python 深色版本 n = len(inp)这行代码获取输入字符串
inp的长度n。 -
遍历所有可能的子串长度:
Python 深色版本 for i in range(1, n // 2 + 1):这行代码遍历从 1 到
n // 2的所有可能的子串长度。我们只需要遍历到n // 2,因为一个子串至少要重复一次才能构成原字符串。 -
检查子串长度是否能整除字符串长度:
Python 深色版本 if n % i == 0:这行代码检查子串长度
i是否能整除字符串长度n。如果能整除,说明这个子串有可能是重复子串。 -
提取子串并构建重复子串:
Python 深色版本 substring = inp[:i] repeated_substring = substring * (n // i)这两行代码提取长度为
i的子串substring,并将其重复拼接n // i次,得到新的字符串repeated_substring。 -
比较新字符串和原字符串:
Python 深色版本 if repeated_substring == inp: return substring这行代码比较新字符串
repeated_substring和原字符串inp。如果相等,说明找到了符合条件的子串,返回这个子串。 -
处理没有找到的情况:
Python 深色版本 return ""如果遍历完所有可能的子串长度后,没有找到符合条件的子串,返回空字符串。
测试用例
solution("abcabcabcabc")应该返回'abc',因为"abc"重复 4 次可以得到"abcabcabcabc"。solution("aaa")应该返回'a',因为"a"重复 3 次可以得到"aaa"。solution("abababab")应该返回'ab',因为"ab"重复 4 次可以得到"abababab"。solution("ab")应该返回'',因为"ab"无法由更短的子串重复拼接而成。