Expression Add Operators

Given a string that contains only digits 0-9 and a target value, return all possibilities to add binary operators (not unary) +-, or *between the digits so they evaluate to the target value.

Examples: 

"123", 6 -> ["1+2+3", "1*2*3"] 
"232", 8 -> ["2*3+2", "2+3*2"]
"105", 5 -> ["1*0+5","10-5"]
"00", 0 -> ["0+0", "0-0", "0*0"]
"3456237490", 9191 -> []

思路:这个题目考察的非常好。区分度很大。首先想到是dfs+backtracking这谁都没问题,然后从例子中看到10-5,说明数字还是可以连续的在一起组成一个新的数字的,那么递归毫无疑问了,substring,这题关键点在于3-1*4出现这种情况,*4的时候,怎么和之前计算的结果进行发生关系导出后面的结果,这里的tricky的地方就是要传递一个上次计算出现的值,preNum,这样3-1=2, 那么curSum = 2, preNum = -1,那么由curSum -preNum 得到3,那么再有preNum * curNum计算得到-1*4,另外,还有一个坑就是string的题,只要有数字,就要想到溢出问题,解决方案就是用long来解决。

class Solution {
    //3-1*4
    public List<String> addOperators(String num, int target) {
        List<String> list = new ArrayList<>();
        if(num == null || num.isEmpty()) {
            return list;
        }
        StringBuilder sb = new StringBuilder();
        dfs(list, num, 0, 0, 0, sb, target);
        return list;
    }
    
    private void dfs(List<String> list, String num, long cursum, long preNum, int index, 
                    StringBuilder sb, int target) {
        if(index == num.length()) {
            if(cursum == target) {
                list.add(sb.toString());
            }
            return;
        }
        for(int i = index; i < num.length(); i++) {
            String str = num.substring(index, i + 1);
            if(str.length() > 1 && str.charAt(0) == '0') {
                continue;
            }
            long curNum = Long.parseLong(str);
            int len = sb.length();
            if(index == 0) {
                //第一个数,不需要加任何符号;
                dfs(list, num, curNum, curNum, i + 1, sb.append(str), target);
                sb.setLength(len);
            } else {
                // +;
                dfs(list, num, cursum + curNum, curNum, i + 1, sb.append("+").append(str), target);
                sb.setLength(len);
                
                // -;
                dfs(list, num, cursum - curNum, -curNum, i + 1, sb.append("-").append(str), target);
                sb.setLength(len);
                
                // *;
                dfs(list, num, cursum - preNum + preNum * curNum, preNum * curNum, i + 1, sb.append("*").append(str), target);
                sb.setLength(len);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值