Edit Distance

来源:互联网 发布:网络安全设备巡检报告 编辑:程序博客网 时间:2024/05/17 16:13

题目大意:求最短编辑距离。

解题思路,动态规划

用dp[i][j]表示字符串str1的0~i和str2的0~j的最短编辑距离。

dp[i][j]只有3个来源:

1)dp[i - 1][j] + 1表示str1的0~ i - 1和str2的0~j的最短编辑距离 + 1,表示删除str1的第i个字符;

2)dp[i][j - 1] 表示str1的0~i和str2的0~ j - 1的最短编辑距离 + 1,表示删除str2的第j个字符;

3)dp[i - 1][j - 1]表示str1的0~ i - 1和str2的0 ~ j-1的最短编辑距离,若str1[i] !=str2[j],则+1,表示更改str1[i]或者str2[j]


注意初始化工作


class Solution {public:        int minDistance(string word1, string word2) {        if(word1.size() == 0)          return word2.size();        if(word2.size() == 0)          return word1.size();        vector<vector<int> > dp(word1.size(), vector<int>(word2.size(), 0));        if(word1[0] != word2[0])          dp[0][0] = 1;        for(int i = 1; i < word2.size(); i++) {            dp[0][i] = (word1[0] == word2[i] ? i : dp[0][i - 1] + 1);        }        for(int i = 1; i < word1.size(); i++) {            dp[i][0] = (word1[i] == word2[0] ? i : dp[i - 1][0] + 1);        }        for(int i = 1; i < word1.size(); i++) {            for(int j = 1; j < word2.size(); j++) {                int temp = min(dp[i - 1][j], dp[i][j - 1]);                if(word1[i] == word2[j])                  dp[i][j] = min(temp + 1, dp[i - 1][j - 1]);                else                  dp[i][j] = min(temp + 1, dp[i - 1][j - 1] + 1);            }        }        return dp[word1.size() - 1][word2.size() - 1];    }};


0 0