Leetcode 76. Edit Distance

 

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

 

思路: 参考http://www.cnblogs.com/yuzhangcmu/p/4190264.html

二维DP典型题目。

定义D[i][j] 为string1 前i个字符串到 string2的前j个字符串的转化的最小步。
1. 初始化: D[0][0] = 0;  2个空string 不需要转
2. D[i][0] = D[i - 1][0] + 1. 就是需要多删除1个字符
3. D[0][j] = D[0][j - 1] + 1. 就是转完后需要添加1个字符

 

D[i][j] 的递推公式:
我们来考虑最后一步的操作:
从上一个状态到D[i][j],最后一步只有三种可能:
添加,删除,替换(如果相等就不需要替换)

a、给word1插入一个和word2最后的字母相同的字母,这时word1和word2的最后一个字母就一样了,此时编辑距离等于1(插入操作) + 插入前的word1到word2去掉最后一个字母后的编辑距离
D[i][j - 1] + 1
例子:  从ab --> cd
我们可以计算从 ab --> c 的距离,也就是 D[i][j - 1],最后再在尾部加上d

b、删除word1的最后一个字母,此时编辑距离等于1(删除操作) + word1去掉最后一个字母到word2的编辑距离
D[i - 1][j] + 1
例子:  从ab --> cd
我们计算从 a --> cd 的距离,再删除b, 也就是 D[i - 1][j] + 1

c 、把word1的最后一个字母替换成word2的最后一个字母,此时编辑距离等于 1(替换操作) + word1和word2去掉最后一个字母的编辑距离。
这里有2种情况,如果最后一个字符是相同的,即是:D[i - 1][j - 1],因为根本不需要替换,否则需要替换,就是
D[i - 1][j - 1] + 1


例子: "ababd" -> "ccabab"

  先初始化matrix如下。意思是,比如"_" -> "cca" = 2 操作是插入'c','c','a',共3步。 "abab" -> "+ "_" 删除'a','b','a','b',共4 步。

  _ a b a b d
_ 0 1 2 3 4 5
c 1          
c 2          
a 3          
b 4          
a 5          
b 6          

  然后按照注释里的方法填满表格,返回最后一个数字(最佳解)

 

 

  _ a b a b d
_ 0 1 2 3 4 5
c 1 1 2 3 4 5
c 2 2 2 3 4 5
a 3 2 3 2 3 4
b 4 3 2 3 2 3
a 5 4 3 2 3 3
b 6 5 4 3 2 3

 

 1 class Solution(object):
 2     def minDistance(self, word1, word2):
 3         """
 4         :type word1: str
 5         :type word2: str
 6         :rtype: int
 7         """
 8         if not word1 and not word2:
 9             return 0
10         
11         len1 = len(word1)+1
12         len2 = len(word2)+1
13         
14         D = [[0 for x in range(len2)] for y in range(len1)]
15         
16         for i in range(len1):
17             for j in range(len2):
18                 if i == 0:
19                     D[i][j] = j
20                 elif j == 0:
21                     D[i][j] = i
22                 else:
23                     if word1[i-1] == word2[j-1]:
24                         D[i][j] = D[i-1][j-1]
25                     else:
26                         D[i][j] = min(D[i-1][j-1], D[i][j-1], D[i-1][j])
27                         D[i][j] += 1
28         
29         return D[-1][-1]                      

 

posted @ 2017-02-25 03:24  lettuan  阅读(164)  评论(0编辑  收藏  举报