https://leetcode.com/problems/edit-distance/description/
动态规划:
一、定义状态
设定二维数组 dp[i][j] 代表字符串 s1 的前 i 个转化成 s2 的前 j 个所需要操作。
二、寻找状态转移方程
分析:dp[i][j] 可由 dp[i-1][j](增加), dp[i][j-1](删除), dp[i-1][j-1](要看s1[i-1]跟s2[j-1]是否相等) 三种状态转化而来
转移方程:dp[i][j] = min( min(dp[i-1][j], dp[i][j-1])+1, dp[i-1][j-1]+ s1[i-1]==s2[j-1]?0:1 )
三、处理初始值
两种边界值:i==0, dp[0][j] = j(增加); j==0, dp[i][0] = i(删除)
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.length();
int n = word2.length();
cout<<m<<" "<<n<<endl;
vector<vector<int> >dp(m+1, vector<int>(n+1));
for(int i=0; i<=m; i++){
for(int j=0; j<=n; j++){
if(i==0){
dp[i][j] = j;
}else if(j==0){
dp[i][j] = i;
}else{
dp[i][j] = min( min(dp[i-1][j], dp[i][j-1])+1, dp[i-1][j-1]+ (word1[i-1]==word2[j-1]?0:1) );
}
}
}
int ans = dp[m][n];
cout<<ans<<endl;
return ans;
}
};
1259

被折叠的 条评论
为什么被折叠?



