leetCode 72. Edit Distance

来源:互联网 发布:剑三新手捏脸数据 编辑:程序博客网 时间:2024/05/05 05:04

问题

https://leetcode.com/problems/edit-distance/

解法

考虑从单词后面向前修改word1, 设置状态f(i, j) 表示将word1 【0~i】修改为word2 【0~j】所需要的次数。
有三种对应的修改方法, 状态转移方程为
f(i, j) = f(i-1, j-1) +1 //如果word1[i] != word2[j] 修改
f(i, j) = f(i-1, j-1) // 如果word1[i] == word2[j] 直接匹配
f(i, j) = f(i-1, j) +1 // 删除word1[i]
f(i, j) = f(i, j-1) +1 // 增加word2[j];
f(i, j) 取上面三种情况的最小值。
可以从前向后推导出所有情况。

空间复杂度O(2*m) 时间复杂度O(n*m)

class Solution {public:    int minDistance(string word1, string word2) {        // covert word1 to word2 equal to convert word2 to word1        const char* w1 = word1.c_str();        const char* w2 = word2.c_str();        int m = word1.size(), n = word2.size();        if (word1.size() > word2.size())        {            swap(m, n);            swap(w1, w2);        }        vector<int> dpRow(m+1, 0);        vector<vector<int>> dp(2, dpRow);        int read = 0;        for (int i=0; i<=m; ++i)            dp[read][i] = i;        for (int i=1; i<=n; ++i)        {            dp[!read][0] = dp[read][0]+1;            for (int j=1; j<=m; ++j)                dp[!read][j] = min(dp[read][j-1] + (w1[j-1] == w2[i-1] ? 0:1),                                     min(dp[read][j]+1, dp[!read][j-1]+1));            read = !read;        }        return dp[read][m];    }};
0 0
原创粉丝点击