题解 | #计算字符串的编辑距离#
计算字符串的编辑距离
https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314
#include <iostream> #include <string> #include <vector> #include <set> using namespace std; int LevenShteinDistance(string& s1, string& s2) { //标准解法是利用动态规划的算法,和0-1背包问题的解法是一回事 //设定的这个矩阵大小为m+1 * n+1,第i行第j个表示,对于长度为i的s1字符串子串, //长度为j的s2字符串子串需要进行多少的个操作数 vector<vector<int>> dp(s1.size() + 1, vector<int>(s2.size() + 1, 0)); //第一行和第一列代表,如果另外一个字符串为0的情况下,需要多少个操作数 //第一行 for (int i = 1; i != s1.size() + 1; ++i) { dp[i][0] = i; } for (int i = 1; i != s2.size() + 1; ++i) { dp[0][i] = i; } //判断的核心就是如果新添加的字符串,如果和另外一个字符串的最后一位相同,那么就不需要添加额外操作 //否则需要添加一个操作 for (int i = 1; i != s1.size() + 1; ++i) { for (int j = 1; j != s2.size() + 1; ++j) { if (s1[i - 1] == s2[j - 1]) dp[i][j] = dp[i - 1][j - 1]; //这个怎么理解呢,假如字符串1取i-1个,字符串2取j-1个,然后把这两个字符串的编辑距离是 //dp[i-1][j-1],那么此时,加了一个字符,字符串1是i个,字符串2是j个,那么编辑距离肯定变为 //假如加的这俩相同,一模一样,是否相当于没有增加任何的操作数,那么dp[i][j] = dp[i-1][j-1] else { //假如两个不一样呢,字符串1有i个,字符串2的前j-1个,此时的操作数为dp[i][j-1],字符串2多加一个 //值,经过这个操作数以后,两个字符串都相同了,突然其中一个加了一个,那么操作数+1;第二种情况就是 //dp[i-1][j]是字符串1只取前i-1个,然后变成字符串1取前j个的操作数,两者完全一样了,突然给i增加一个字符 //那么操作数依然得+1;第三种情况就是dp[i-1][j-1],即经过这个操作数以后,字符串1前i-1个,字符串前j-1个 //变成了一样的,然后这个时候,各加了一个字符,那么进行一个替换操作,操作数+1 dp[i][j] = min(dp[i - 1][j - 1] + 1, dp[i][j - 1] + 1); dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1); } } } return dp[s1.size()][s2.size()]; } int main() { string s1, s2; getline(cin, s1); getline(cin, s2); cout << LevenShteinDistance(s1, s2); } // 64 位输出请用 printf("%lld")
解析都写代码里了,自己看吧