lintcode 119. 编辑距离 动态规划
程序员文章站
2022-03-24 17:20:21
...
给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:
插入一个字符
删除一个字符
替换一个字符
样例
样例 1:
输入:
"horse"
"ros"
输出: 3
解释:
horse -> rorse (替换 'h' 为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
样例 2:
输入:
"intention"
"execution"
输出: 5
解释:
intention -> inention (删除 't')
inention -> enention (替换 'i' 为 'e')
enention -> exention (替换 'n' 为 'x')
exention -> exection (替换 'n' 为 'c')
exection -> execution (插入 'u')
分析:采用动态规划解题,初始化dp数组,int[][] dp=new int[word1.length+1][word2.length+1],dp[i][j]表示到word1下标为i,word2下标为j时的最小编辑距离。
接下来以题目的例子来解释思路
初始状态都假设为两个字符串为空,则要由空达到word2的情况需要word2.length的编辑距离,同理得,由空达到word1的情况需要word1.length的编辑距离.
然后可以简单的分为增加,替换,删除这三种情况来考虑:
(1)增加:可只看第一,二行及其所有列,此时,word1只有I,word2则是execution,此时需要增加字母,需要的编辑次数,即dp【i】【j】=dp【i-1】【j】+1
(2)删除,可只看第一二列及其所有行,此时,word1为intention,word2为e,则word1需要删除才可以达到word2,需要的编辑次数,即dp【i】【j】=dp【i】【j+1】+1
(3)替换:可只看第一二行和第一二列,此时word1为i,word2为e,word1转为word2,只要替换掉即可,所有dp【i】【j】=dp【i-1】【j-1】+1
如若相同,则直接继承之前得到的最小编辑距离,即dp【i】【j】=dp【i-1】【j-1】
class Solution {
public:
/**
* @param word1: A string
* @param word2: A string
* @return: The minimum number of steps.
*/
int minDistance(string &word1, string &word2) {
// write your code here
int len1=word1.size();
int len2=word2.size();
if(len1==0) return len2;
if(len2==0) return len1;
vector<vector<int>> dp(len1+1,vector<int>(len2+1,0)) ;
for (int i = 0; i <= len1; i++) {
dp[i][0]=i;
}
for (int i = 0; i <= len2; i++) {
/* code */
dp[0][i]=i;
}
for(int i = 1 ;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(word1[i-1]==word2[j-1])
{
dp[i][j]=dp[i-1][j-1];
}
else
{
dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
}
return dp[len1][len2];
}
};