思路:dp[i][j],表示s串的前i个变成t串的前j个的最短编辑距离,所谓编辑就是修改、删除、和插入
编辑距离的转移方程是
初始化所有dp[i][j] = 目标串的长度
如果s[i]==t[j] 则dp[i][j]=min(dp[i-1][j-1]-1,dp[i][j])
否则 dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1]) 依次对应的操作是删除,修改,插入。
这个题我的思路是t串向s串转移,只能做修改和插入操作,不能删除,当然从s串向t串转移也可以,但是操作不一样
所以转移方程:
如果s[i]==t[j] 则dp[i][j]=min(dp[i-1][j-1]-1,dp[i][j])
否则 dp[i][j]=min(dp[i-1][j-1],dp[i][j-1])
上代码:
s=input()
t=input()
n=len(s)
m=len(t)
dp=[[len(t) for i in range(n+1)] for i in range(m+1)]
ans=len(t)
for i in range(1,1+m):
for j in range(i,n-m+i+1):
if (s[j-1]==t[i-1]):
dp[i][j]=min(dp[i-1][j-1]-1,dp[i][j])
else:
dp[i][j]=min(dp[i-1][j-1],dp[i][j-1])
ans = min(ans, dp[i][j])
print(ans)
通过情况