LeetCode72 编辑距离
算法思想:这是一个经典的笔试面试题。这里用到DP的方法求解,dp(i)(j)表示的是第一个字符串的第i个位置和第二个字符串的第j个位置的编辑距离。要计算这个编辑距离就可以从dp(i-1)(j-1)和dp(i-1)(j)和dp(i)(j-1)这几个角度去考虑。当第i-1个字符和第j-1个字符相等的时候,dp(i)(j)=dp(i-1)(j-1),否则的话,可能是修改第i个字符,dp(i)(j) = dp(i-1)(j-1)+1,或者在第i-1个字符后添加一个字符,dp(i)(j) = dp(i-1)(j)+1,或者是在第j-1个字符后添加一个字符,dp(i)(j) = dp(i)(j-1)+1,在这几种方案里面取最小值即可。这里需要进行的初始化是假设一个串为空的情况,比如dp(i)(0) =i,表示第二个字符串需要添加i个字符,dp(0)(j) = j,表示第一个字符串添加j个字符。
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.size(),n = word2.size();
if(m*n==0) return n+m; //有一个串为空串的情况
vector<vector> dp(m+1,vector(n+1));
for(int i=0;i<m+1;i++)
dp[i][0] = i;
for(int j=0;j<n+1;j++)
dp[0][j] = j;
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;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],min(dp[i][j-1],dp[i-1][j-1]))+1;
}
}
return dp[m][n];
}
};