力扣 282. 给表达式添加运算符 dfs 回溯

62 篇文章 0 订阅
18 篇文章 0 订阅
该博客介绍了如何运用回溯算法解决LeetCode中的一个问题——给定一个仅包含数字的字符串,添加运算符(+,-,*)使其结果等于目标值。博主分享了C++实现的代码,并指出在处理过程中需要注意数字0作为起始数字时不能与其他数字连接的细节。
摘要由CSDN通过智能技术生成

https://leetcode-cn.com/problems/expression-add-operators/

思路:很明显的回溯了吧。。考虑每个位置的运算符种类有三种以及数字可以连起来,那么相当于每个位置有四种选择,直接暴力计算时间复杂度为 O ( 4 n ) O(4^{n}) O(4n),考虑 n n n最大不过等于10,还是可以通过滴~需要注意的一个细节问题是,如果以位置 i i i为一个数的起始,且其为0,那么后续就不能再跟其他数字了!

class Solution {
public:
    vector<string> addOperators(string num, int target) {
        vector<string> ans;
        using ll=long long;
        string expr;
        function<void(int, ll, ll)> cal=[&](int pos, ll val, ll pre)
        {
            int n=num.size();
            if(pos>=n)
            {
                if(val==target)
                    ans.push_back(expr);
                return;
            }
            int curSize=expr.size();
            if(pos>0)
                expr+=' ';
            ll curVal=0;
            for(int i=pos;i<n;i++)
            {
                int posVal=num[i]-'0';
                curVal=curVal*10+posVal;
                expr+=num[i];
                if(pos==0)
                    cal(i+1, curVal, curVal);
                else
                {
                    expr[curSize]='+';
                    cal(i+1, val+curVal, curVal);
                    expr[curSize]='-';
                    cal(i+1, val-curVal, -curVal);
                    expr[curSize]='*';
                    cal(i+1, val-pre+curVal*pre, curVal*pre);
                }
                if(i==pos&&num[pos]=='0')
                    break;
            }
            expr.resize(curSize);
        };
        cal(0, 0, 0);
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值