在做leetcode NO.72时,书写了如下的递归代码
unordered_map<pair<int, int>, int > savePair;
pair<int, int> pr;
string w1, w2;
int minDistance(string word1, string word2) {
w1 = word1, w2 = word2;
return dp(w1.size() - 1, w2.size() - 1);
}
int dp(int i, int j){
pr = make_pair(i, j);
if (savePair.count(pr)){
return savePair[pr];
}
if (i == -1) return j + 1;
if (j == -1) return i + 1;
if (w1[i] == w2[j]){
pr = make_pair(i - 1, j - 1);
savePair[pr] = dp(i - 1, j - 1);
}else{
pr = make_pair(i - 1, j - 1);
savePair[pr] = min({dp(i - 1, j - 1), dp(i, j - 1), dp(i - 1, j)}) + 1;
}
return savePair[pr];
目的是将pair做key,变化的字符数做val
但是报错大体如下
搜了一下解决方式代码块如下:
struct hash_pair {
template <class T1, class T2>
size_t operator()(const pair<T1, T2>& p) const
{
auto hash1 = hash<T1>{}(p.first);
auto hash2 = hash<T2>{}(p.second);
return hash1 ^ hash2;
}
};
unordered_map<pair<int, int>, int, hash_pair > savePair;
pair<int, int> pr;
string w1, w2;
int minDistance(string word1, string word2) {
w1 = word1, w2 = word2;
return dp(w1.size() - 1, w2.size() - 1);
}
int dp(int i, int j){
pr = make_pair(i, j);
if (savePair.count(pr)){
return savePair[pr];
}
if (i == -1) return j + 1;
if (j == -1) return i + 1;
if (w1[i] == w2[j]){
pr = make_pair(i - 1, j - 1);
savePair[pr] = dp(i - 1, j - 1);
}else{
pr = make_pair(i - 1, j - 1);
savePair[pr] = min({dp(i - 1, j - 1), dp(i, j - 1), dp(i - 1, j)}) + 1;
}
return savePair[pr];
}
虽然run了,但是递归调用是真的花时太大了
代码原链接:C++ 使用unordered_map, pair作为key_荔枝娘娘的博客-优快云博客_c++map的key是pair