C++在使用unordered_map需要用pair当key报错

博主分享了一段关于如何使用unordered_map以pair作为键优化LeetCode问题72(最小编辑距离)的递归代码,通过哈希函数加速查找,但强调了递归调用导致的时间效率问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值