问题描述
给定一个字符串 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"
)