LeetCode 72. Edit Distance

来源:互联网 发布:excel2007软件 编辑:程序博客网 时间:2024/06/06 08:53

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;    }};