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

107 阅读3分钟

问题描述

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

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

解题思路

1. 理解问题

我们需要判断一个字符串是否可以由某个子串重复拼接而成。如果可以,返回这个最短的子串;否则,返回空字符串。

2. 数据结构选择

我们可以使用字符串操作来解决这个问题。不需要额外的数据结构。

3. 算法步骤

  • 遍历可能的子串长度
    从1到字符串长度的一半,尝试每一个可能的子串长度。
  • 检查子串是否能重复拼接成原字符串
    个子串长度,截取子串并重复拼接,检查是否等于原字符串。
  • 返回结果
    一个子串能重复拼接成原字符串,返回该子串;否则,返回空字符串。

代码框架

def solution(inp):
    # 获取字符串长度
    n = len(inp)
    
    # 遍历可能的子串长度
    for length in range(1, n // 2 + 1):
        # 如果当前长度能被字符串长度整除
        if n % length == 0:
            # 截取子串
            substring = inp[:length]
            # 重复拼接子串
            repeated_substring = substring * (n // length)
            # 检查是否等于原字符串
            if repeated_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") == "")

关键步骤

  • 遍历可能的子串长度
    我们只需要遍历到字符串长度的一半,因为如果子串长度超过一半,它不可能重复拼接成原字符串。
  • 检查子串是否能重复拼接成原字符串
    子串并重复拼接,我们可以快速检查是否等于原字符串。

优化部分代码

def solution(inp):
    n = len(inp) 
    if n == 1:     # 如果字符串长度为1,直接返回空字符串
        return ""
    
    for length in range(1, n // 2 + 1):     # 遍历可能的子串长度,从1到字符串长度的一半
        if n % length == 0:                 # 如果当前长度能被字符串长度整除
            substring = inp[:length]        # 截取子串
            if substring * (n // length) == inp:  # 重复拼接子串,检查是否等于原字符串
                return substring
    
    return ""

截取子串并检查

substring = inp[:length]
if substring * (n // length) == inp:
    return substring

这一步截取长度为 length 的子串,并将其重复拼接 n // length 次。如果拼接后的字符串等于原字符串 inp,则返回这个子串。

结语

本题主要考验对字符串的操作以及循环与条件的判断。

希望此篇文章对您有所帮助