题解 | #编辑距离(一)#
编辑距离(一)
https://www.nowcoder.com/practice/6a1483b5be1547b1acd7940f867be0da
想复杂了,也想简单了。想复杂在于一开始没想到有这样一个动态规则,就想着字符串匹配那一套了;想简单在于只想着第一个字符串合起来去匹配,没想到“abba”“abxba”这类情况。
#include <vector> class Solution { public: int editDistance(string str1, string str2) { int len1 = str1.length(), len2 = str2.length(); vector<vector<int>>dp(len1 + 1, vector<int>(len2 + 1, 0)); for (int i = 1; i <= len1; i++) dp[i][0] = i; for (int i = 1; i <= len2; i++) dp[0][i] = i; for (int i = 1; i <= len1; i++) { for (int j = 1; j <= len2; j++) { dp[i][j] = str1[i - 1] == str2[j - 1] ? dp[i - 1][j - 1] : (min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1); } } return dp[len1][len2]; } //以下记录自己错误的思路 // void preprocess(string& s1, string& s2) { // int len1 = s1.length(), len2 = s2.length(); // if (len1 == len2) return; // unordered_map<int, unordered_set<int>> hash; // for (int i = 0; i < len1; i++) { // if (hash.find(s1[i]) != hash.end()) hash[s1[i]].insert(i); // else hash[s1[i]] = unordered_set<int> {i}; // } // int id = 0, maxnum = 0; // for (int i = 0; i < len2 - len1 + 1; i++) { // int tmp = 0; // for (int j = i; j < len2; j++) { // if (hash.find(s2[j]) != hash.end() && // hash[s2[j]].find(j - i) != hash[s2[j]].end()) { // tmp++; // } // } // if (tmp > maxnum) { // maxnum = tmp; // id = i; // } // } // string head(id, '#'), tail(len2 - len1 - id, '#'); // s1 = head + s1 + tail; // } // int editDistance(string str1, string str2) { // if (str1.length() > str2.length()) return editDistance(str2, str1); // preprocess(str1, str2); // printf("%s", str1.c_str()); // int res = 0; // for (int i = 0; i < str1.length(); i++) { // if (str1[i] == '#' || str1[i] != str2[i]) { // res++; // } // } // return res; // } };