51Nod-1183-编辑距离

来源:互联网 发布:钓鱼生成软件下载 编辑:程序博客网 时间:2024/06/05 14:18

51Nod-1183-编辑距离

                1183 编辑距离编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:sitten (k->s)sittin (e->i)sitting (->g)所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。给出两个字符串a,b,求a和b的编辑距离。Input第1行:字符串a(a的长度 <= 1000)。第2行:字符串b(b的长度 <= 1000)。Output输出a和b的编辑距离Input示例kittensittingOutput示例3

解题方法

51Nod的题近乎都是模板题,此题也不例外。
该题是莱文斯坦距离算法的模板题。
利用动态规划来解。
子问题定义为:
遍历到A的第i个字符,B的第j个字符时,f[i][j]为当前的操作数。
动态转移方程式为:

f[i][j] = min(f[i-1][j]+1, f[i][j-1]+1, f[i-1][j-1]+(A[i-1] != B[j-1]))f[i][j] = min(删除操作数,插入操作数,替换操作数)

可以翻墙的可以看看维基百科上对编辑距离的一些资料——编辑距离


解题代码

def solve(A, B):    la, lb = len(A), len(B)    f = [[0 for _ in range(lb+1)] for _ in range(la+1)]    for i in range(la+1):        f[i][0] = i    for i in range(lb+1):        f[0][i] = i    for i in range(1, la+1):        for j in range(1, lb+1):            #min(删除操作数,插入操作数,替换操作数)            f[i][j] = min(f[i-1][j]+1, f[i][j-1]+1, f[i-1][j-1]+(A[i-1] != B[j-1]))    return f[la][lb]while True:    try:        A = input()        B = input()        print(solve(A, B))    except EOFError:        break