583. Delete Operation for Two Strings Medium

来源:互联网 发布:唐国强诸葛亮知乎 编辑:程序博客网 时间:2024/05/22 10:31

这道题需要我们通过在两个字符串中分别删除一些字符,使得他们成为相等的字符串。跟编辑距离类似,我们采用动态规划来解决。(参考 http://blog.csdn.net/hhygcy/article/details/3948969)


实际上,我们需要做的其实是求出最长公共子序列(Longest Common Subsequence)。注意这里是子序列,不是子串,是可以不连续的,只要保持相对顺序就可以了。


我们用dis[i][j]来表示字符串word1长为i的子串和字符串word2长为j的子串,它们的最长公共子序列的长度。然后考虑状态转移方程。

class Solution {public:    int minDistance(string word1, string word2) {        int dis[word1.size() + 1][word2.size() + 1];        for(int i = 0; i <= word1.size(); i++){        for(int j = 0; j <= word2.size(); j++){        if(i == 0 || j == 0)dis[i][j] = 0; //子串为空,没有公共子序列        else {            //状态转移:如果word1[i - 1] == word2[j - 1],相当于在两个子串后边加上相同的字符,公共子序列长度加一                            //注意这里比较的是word1的第i个,下标就是i-1,和word2的第j个,下标就是j-1          //如果不相等,就由各加一个字符的两种情况下,最大值决定最长公共子序列        dis[i][j] = word1[i - 1] == word2[j - 1] ?  dis[i - 1][j - 1] + 1 : max(dis[i - 1][j], dis[i][j - 1]);    }    }    }        int d = dis[word1.size()][word2.size()];    return word1.size() - d + word2.size() - d;    }};





0 0