题解 | #编辑距离(一)#
编辑距离(一)
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;
// }
};

查看17道真题和解析
网易游戏公司福利 548人发布