字节青训营还原原始字符串

57 阅读1分钟

问题描述

给定一个字符串 F,这个字符串是通过对某个初始字符串 S 执行若干次以下操作得到的:

  • 选择一个整数 K(其中 0≤K<∣S∣∣,∣S∣ 表示字符串 S 的长度)
  • 将 SS从第 K个位置(从0开始计数)到末尾的子串追加到 S 的末尾,即:S=S+S[K:]

输入格式

  • 输入为一个字符串 F,仅包含小写字母,长度不超过 1000。

输出格式

  • 输出一个字符串,表示可能的最短初始字符串 S。
  • 如果无法通过题目描述的操作得到字符串 F,则输出原字符串 F。

分析:

  • 最短:初始字符串的长度从短开始遍历
  • 判断是否为初始字符串:

1.初始字符串在进行操作后是否时目标的前缀2.操作时,k的取值要进行遍历

代码

def solution(str1):
    # Edit your code here
    def can_generate(initial: str, target: str) -> bool:
        if initial==target:
            return True
        current=initial
        
        while len(current)<len(target):
            flag =False
            for k in range(len(current)):
                next_str=current+current[k:]
                if target.startswith(next_str):
                    current=next_str
                    flag=True
                    break
            if not flag:
                return False
        return current == target
    n = len(str1)
    # 从长度1开始尝试所有可能的前缀
    for length in range(1, n + 1):
        #这里初始字符串都是从短开始的
        prefix = str1[:length]
        if can_generate(prefix, str1):
            return prefix
    
    # 如果没有找到解,返回原字符串
    return str1



if __name__ == "__main__":
    # Add your test cases here

    print(solution("abbabbbabb") == "ab")
    print(solution("abbbabbbb") == "ab")
    print(
        solution(
            "jiabanbananananiabanbananananbananananiabanbananananbananananbananananbanananan"
        )
        == "jiaban"
    )
    print(
        solution(
            "selectecttectelectecttectcttectselectecttectelectecttectcttectectelectecttectcttectectcttectectcttectectcttect"
        )
        == "select"
    )
    print(
        solution(
            "discussssscussssiscussssscussssdiscussssscussssiscussssscussssiscussssscussss"
        )
        == "discus"
    )