假设我们只想使用3种类型的操作将一个字符串S1转换为另一个字符串S2:
-Insert(pos,char) (costs 8)
-Delete(pos) (costs 6)
-Replace(pos,char) (costs 8)
找到将S1转换为S2的步骤顺序,以便将S1转换为S2的成本最小。 例如。 “计算”到“迟到” - 可能的操作是
Delete(0)
Delete(1)
Delete(2)
Delete(3)
Delete(4)
以上操作顺序为30。
我使用以下代码执行此操作,但它没有给出正确的结果。 使用的算法是Levenshtein。
tuples=[]
ops=[]
s1=''
s2=''
def levenshtein(a,b):
global s1,s2
n, m = len(a), len(b)
if n > m:
a,b = b,a
n,m = m,n
s1,s2=a,b
current = range(n+1)
for i in range(0,len(current)):
current[i]=current[i]*8
tuples.append(current)
for i in range(1,m+1):
previous, current = current, [i*8]+[0]*n
for j in range(1,n+1):
add, delete = previous[j]+6, current[j-1]+8
change = previous[j-1]
if a[j-1] != b[i-1]:
change=change+8
current[j] = min(add, delete, change)
tuples.append(current)
return current[n]
print levenshtein('calculate','late')
答案 0 :(得分:5)
您可以使用Levenshtein Distance算法
答案 1 :(得分:1)
我会使用dynamic programming解决此问题。使用二维数组mem[n1][n2]
,其中mem[i][j]
存储将从位置i
开始的第一个字符串的后缀转换为从j
开始的第二个字符串的后缀的最低成本。
你的方法看起来很贪婪,而且我认为对于更大的例子来说这将是非常缓慢的。