编辑距离用于计算两个字符串的差距。即字符串s1经过几步操作可以变成字符串s2,操作有增删改。
比如 s1=abc. s2=aecf。 他们的编辑距离是2 ,把s1的b改成e,然后是s1增加f。需要2步。
dp[i][ j]=s1[0…i] 和 s2[0…j] 的最小编辑距离
基本思路是 ,s1下标i对应的s2下标j的字符是否相等。相等不用动,dp[i][j]=dp[i-1][j-1]
不等有3种操作。
增加操作:dp[i][j]=dp[i][j-1]+1; 如果[0…i]已经转成[0…j-1]的情况下,要把[0…i]转成[0…j]需要怎么做呢,需要插入一个j,
删除操作:dp[i][j]=dp[i-1][j]+1;如果[0…i-1]已经跟[0…j]一样了,要把[0…i]转成[0…j]需要怎么做呢,因为i-1的时候已经跟J一样了,所以这个i超了,需要删掉
修改操作:dp[i][j]=dp[i-1][j-1]+1;如果[0…i-1]已经跟[0…j-1]一样了,但是我们知道I跟j不同,那当然需要吧 s1(i)改成s2(j).
编辑距离取得是最小值所以有dp[i][j]=min(增,删,改)
伪码如下
for i in s1:
dp[i][0]=i;#转成空串
for j in s2:
dp[0][j]=j;#空串转s2
for i in s1:
for j in s2:
if i==j:
dp[i][j]=dp[i-1][j-1]
else:
dp[i][j]=min(增,删,改)
return dp[i][j];