题目描述:
给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串? 例如: s1 = "abcde", s2 = "axbc", 结果为1, 因为s2删掉'x'就是s1的子串了。
思路:
没有想到好的思路,只能动态规划+暴力枚举
代码:
#暴力枚举+动态规划 (挺复杂的,只能是暴力破解搭配动态规划)
p=input().strip()
s=input().strip()
lenp=len(p)
start_l=[]
end_l=[]
def max_bothsign_len(n_s):
global p,lenp
dp=[[0]*(lenp+1) for i in range(len(n_s)+1)]
for i in range(1,len(n_s)+1):
for j in range(1,lenp+1):
if n_s[i-1]==p[j-1]:
dp[i][j]=1+dp[i-1][j-1]
else:
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
# for d in dp:
# print(d)
return dp[len(n_s)][lenp]
#1、在s中找p的首字母与尾字母的索引,枚举所有的情况。
for i in range(len(s)):
if s[i]==p[0]:
start_l.append(i)
if s[i]==p[-1]:
end_l.append(i)
res=len(s)#初始时设置一个比较大的值
for start in start_l:
for end in end_l:
if start>=end or end-start+1<lenp:
continue
else:
n_s=s[start:end+1]
print(f's[{start}:{end+1}]与p匹配:',n_s, p)
if max_bothsign_len(n_s)==lenp:
res=min(res,end-start+1)
print(f'最少应删除的字符数为:{res-lenp}')
测试用例:
'''
ab
acccbaccbaeb
res:1
ab
acccbaccbab
res:0
'''