LeetCode 贴纸拼词 C++ dfs+dp+剪枝 -注解

该博客介绍了一个使用深度优先搜索(DFS)解决如何用最少数量的贴纸覆盖目标字符串的问题。代码实现中,首先初始化一个字典记录每个贴纸中字符的出现次数,然后通过递归调用DFS函数,对每个可能的贴纸进行尝试,以找到最佳匹配。最终返回的是找到的最小贴纸数量。

在这里插入图片描述
原题链接

class Solution {
private:
    int dfs(unordered_map<string,int>&dp,vector<vector<int>>&dict,string&target){
        int ret=INT_MAX;
        if(dp.count(target)){
            return dp[target];
        }
        vector<int>cout(26.0);//target字符串中字符个数
        for(auto ch:target){
            cout[ch-'a']++;
        }

        //所有的stickers都要进行判断
        for(int i=0;i<dict.size();i++){
            if(dict[i][target[0]-'a']==0){
                //对于stickers字符串中首字母不相同的字符串先不进行判断,优先挑首字母相同的
                continue;
            }
            string str;//记录对比后剩余还要进行对比的字符串
            for(int j=0;j<26;j++){
                if(cout[j]>dict[i][j]){
                    //这个字符有cout[j] - dict[i][j]个剩余的没有匹配完
                    str += string(cout[j] - dict[i][j],'a'+j);
                }
            }
            int num=dfs(dp,dict,str);//剩下字符进行递归匹配
            if(num>=0){
                ret=min(ret,num+1);//+1代表了这次循环选了第i张卡片一次,num代表这次匹配后剩下的字符递归后的结果
            }
        }
        if(ret==INT_MAX){
            ret=-1;
        }
        dp[target]=ret;//把这个字符串所用的贴指数记录下来,防止重复遍历
        return ret;
    }
public:
    int minStickers(vector<string>& stickers, string target) {
        unordered_map<string,int>dp;//字符串对应最小贴纸数量
        dp[""]=0;
        int size=stickers.size();
        vector<vector<int>>dict(size,vector<int>(26.0));//每一个字符串中字符的个数
        for(int i=0;i<size;i++){
            for(auto ch:stickers[i]){
                dict[i][ch-'a']++;
            }
        }
        return dfs(dp,dict,target);
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaiRong-NUC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值