題目
子串是一個字符串中連續的一部分,而子列是字符串中保持字符順序的一個子集,可以連續也可以不連續。例如給定字符串 atpaaabpabtt,pabt是一個子串,而 pat 就是一個子列。
現給定一個字符串 S 和一個子列 P,本題就請你找到 S 中包含 P 的最短子串。若解不唯一,則輸出起點最靠左邊的解。
輸入格式:
輸入在第一行中給出字符串 S,第二行給出 P。S 非空,由不超過 10
4
個小寫英文字母組成;P 保證是 S 的一個非空子列。
輸出格式:
在一行中輸出 S 中包含 P 的最短子串。若解不唯一,則輸出起點最靠左邊的解。
輸入樣例:
atpaaabpabttpcat
pat
結尾無空行
輸出樣例:
pabt
結尾無空行
解題思路
P = str(input())
S = str(input())
# P = str("atpaaabpabttpcat")
# S = str("pat")
def isCunzai(input:str, S:str) -> bool:
j = 0
for i in input:
if i == S[j]:
j += 1
if len(S) == j:
return True
return False
resList = []
PList = list(P)
left0 = S[0]
right0 = S[-1]
left0List = []
right0List = []
for index,val in enumerate(PList):
if val == left0:
left0List.append(index)
if val == right0:
right0List.append(index)
minLeng = len(P)
for i in left0List:
for j in right0List:
# print(i,j,P[i:j+1])
length = j +1 - i
if i<=j and length <= minLeng:
PtempStr = (P[i:j+1])
if isCunzai(PtempStr,S) == True:
resList.append(PtempStr)
minLeng = len(PtempStr)
break
# print(resList)
print(min(resList,key= lambda x:len(x)))