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

100 阅读4分钟

一、题目理解

题目旨在解决一个字符串分解的问题,即给定一个输入字符串 inp,需要找出该字符串是否可以由某个子串重复拼接而成。如果能找到这样的子串,就返回该子串;如果找不到,就返回空字符串。

二、代码思路分析

def solution(inp):
    # 遍历所有可能的子串长度
    for length in range(1, len(inp) // 2 + 1):
        # 检查当前长度的子串是否可以重复拼接成原字符串
        if len(inp) % length == 0:
            # 获取当前长度的子串
            substring = inp[:length]
            # 构建通过重复子串得到的字符串
            repeated_string = substring * (len(inp) // length)
            # 检查是否与原字符串相等
            if repeated_string == 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") == "")

1. 遍历可能的子串长度

收起

python

复制

for length in range(1, len(inp) // 2 + 1):

这里通过一个循环遍历从 1 到输入字符串长度一半(向下取整)的所有整数,这些整数代表了可能的子串长度。之所以只遍历到字符串长度的一半,是因为如果子串长度超过了字符串长度的一半,那么它不可能通过重复拼接得到原字符串(除了字符串本身作为子串这种特殊情况,而这种情况在后续逻辑中也能正确处理)。

2. 检查当前长度子串能否重复拼接成原字符串

收起

python

复制

if len(inp) % length == 0:
    substring = inp[:length]
    repeated_string = substring * (len(inp) // length)
    if repeated_string == inp:
        return substring
  • 首先,对于每个可能的子串长度 length,判断输入字符串 inp 的长度是否能被该长度整除。如果能整除,说明存在一种可能性,即原字符串可以由长度为 length 的子串重复拼接而成。
  • 接着,获取当前长度的子串,即通过切片操作 inp[:length] 得到从字符串开头到长度为 length 的子串 substring
  • 然后,通过将获取的子串 substring 重复拼接 len(inp) // length 次,构建出一个新的字符串 repeated_string,其拼接方式是使用乘法运算符对字符串进行重复操作。
  • 最后,将构建的重复字符串 repeated_string 与原输入字符串 inp 进行比较,如果两者相等,说明找到了满足条件的子串,直接返回该子串。

3. 返回结果

收起

python

复制

return ""

如果在遍历完所有可能的子串长度后,都没有找到能够重复拼接成原字符串的子串,那么就返回空字符串,表示原字符串不能由任何子串重复拼接而成(除了它本身作为子串这种特殊情况,前面的逻辑已经涵盖了)。

三、测试用例分析

在 if __name__ == "__main__" 部分添加了多个测试用例来验证代码的正确性:

  • print(solution("abcabcabcabc") == "abc"):输入字符串是由子串 "abc" 重复拼接而成的,代码应该能够正确找到该子串并返回,通过比较返回值与预期值 "abc" 是否相等来验证。

  • print(solution("aaa") == "a"):输入字符串 "aaa" 是由子串 "a" 重复拼接而成的,验证代码能找到子串 "a"。

  • print(solution("abababab") == "ab"):类似地,对于由子串 "ab" 重复拼接而成的输入字符串,检查代码能否正确返回 "ab"。

  • print(solution("ab") == ""):输入字符串 "ab" 不能由除它本身以外的任何子串重复拼接而成,所以应该返回空字符串,通过验证返回值是否为空来检查代码逻辑。

  • print(solution("abcdabcdabcdabcd") == "abcd"):对于由子串 "abcd" 重复拼接而成的输入字符串,确保代码能找到并返回 "abcd"。

  • print(solution("b") == ""):单个字符的输入字符串 "b" 不能由其他子串重复拼接而成,应返回空字符串,用于验证代码在这种简单情况下的正确性。

这些测试用例涵盖了不同类型的输入字符串,包括可以由子串重复拼接而成的情况和不能由子串重复拼接而成的情况,通过验证每个测试用例的结果是否符合预期,能够全面地检验代码逻辑的正确性。

总体而言,这段代码通过遍历可能的子串长度并进行相应的拼接和比较操作,有效地实现了判断输入字符串是否可由子串重复拼接而成以及找出该子串的功能。不过,在实际应用中,可能需要考虑输入字符串为空字符串等特殊情况的处理,以确保代码的完整性和健壮性。