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

54 阅读3分钟

题目分析

题目要求我们编写一个函数 solution,该函数接受一个字符串 inp 作为输入,并判断这个字符串是否可以由某个子串重复拼接而成。如果可以,输出最短的子串;如果不能,输出空字符串。

关键点分析

  1. 重复子串:我们需要找到一个子串,使得将这个子串重复拼接若干次后,能够得到原字符串。
  2. 最短子串:我们要找的是最短的那个重复子串。
  3. 边界条件:如果字符串本身就是一个不可再分的子串(例如 "ab"),则返回空字符串。

解题思路

  1. 遍历所有可能的子串

    • 我们需要遍历所有可能的子串长度,从 1 到字符串长度的一半(因为一个子串至少要重复一次)。
  2. 检查子串是否能整除字符串长度

    • 对于每个可能的子串长度 i,如果字符串长度 n 能被 i 整除,说明这个子串有可能是重复子串。
  3. 构建重复子串

    • 提取长度为 i 的子串 substring,然后将其重复拼接 n // i 次,得到一个新的字符串 repeated_substring
  4. 比较新字符串和原字符串

    • 如果 repeated_substring 和原字符串 inp 相等,说明找到了符合条件的子串,返回这个子串。
  5. 处理没有找到的情况

    • 如果遍历完所有可能的子串长度后,没有找到符合条件的子串,返回空字符串。

代码详解

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"))            # 输出: ''

代码解释

  1. 获取字符串长度

    Python
    深色版本
    n = len(inp)
    

    这行代码获取输入字符串 inp 的长度 n

  2. 遍历所有可能的子串长度

    Python
    深色版本
    for i in range(1, n // 2 + 1):
    

    这行代码遍历从 1 到 n // 2 的所有可能的子串长度。我们只需要遍历到 n // 2,因为一个子串至少要重复一次才能构成原字符串。

  3. 检查子串长度是否能整除字符串长度

    Python
    深色版本
    if n % i == 0:
    

    这行代码检查子串长度 i 是否能整除字符串长度 n。如果能整除,说明这个子串有可能是重复子串。

  4. 提取子串并构建重复子串

    Python
    深色版本
    substring = inp[:i]
    repeated_substring = substring * (n // i)
    

    这两行代码提取长度为 i 的子串 substring,并将其重复拼接 n // i 次,得到新的字符串 repeated_substring

  5. 比较新字符串和原字符串

    Python
    深色版本
    if repeated_substring == inp:
        return substring
    

    这行代码比较新字符串 repeated_substring 和原字符串 inp。如果相等,说明找到了符合条件的子串,返回这个子串。

  6. 处理没有找到的情况

    Python
    深色版本
    return ""
    

    如果遍历完所有可能的子串长度后,没有找到符合条件的子串,返回空字符串。

测试用例

  • solution("abcabcabcabc") 应该返回 'abc',因为 "abc" 重复 4 次可以得到 "abcabcabcabc"
  • solution("aaa") 应该返回 'a',因为 "a" 重复 3 次可以得到 "aaa"
  • solution("abababab") 应该返回 'ab',因为 "ab" 重复 4 次可以得到 "abababab"
  • solution("ab") 应该返回 '',因为 "ab" 无法由更短的子串重复拼接而成。