Leetcode 282.给表达式添加运算符

给表达式添加运算符

给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+-  * ,返回所有能够得到目标值的表达式。

示例 1:

输入: num = "123", target = 6

输出: ["1+2+3", "1*2*3"]

示例 2:

输入: num = "232", target = 8

输出: ["2*3+2", "2+3*2"]

示例 3:

输入: num = "105", target = 5

输出: ["1*0+5","10-5"]

示例 4:

输入: num = "00", target = 0

输出: ["0+0", "0-0", "0*0"]

示例 5:

输入: num = "3456237490", target = 9191

输出: []

题目分析:

此题一看就是要递归,不过递归会有很多边界条件要处理,也要注意递归的参数。

加法,减法直接在之前的基础上处理

不过乘法就麻烦一些了,需要修正之前的结果,减掉一个,再加上最新的乘积

还要注意不能出现000这种数

以及可能的越界

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class Solution {
 5     List<String> res;
 6     /**递归解决此问题*/
 7     public List<String> addOperators(String num, int target) {
 8         res=new ArrayList<String>();
 9         search(num,target,"",(long) 0,(long)0);
10         return res;
11     }
12 
13     /***
14      * 递归的时候,要想好需要什么样的参数,什么时候返回
15      * @param num 初始集合
16      * @param target 目标值
17      * @param tmp    当前集
18      * @param cures  当前结果
19      * @param prenum 上一次的结果,主要是为了用于乘法计算,因为优先级最高
20      */
21     public void search(String num,int target, String tmp,Long cures,long prenum)
22     {
23         if(target==cures&&num.length()==0)
24         {
25 
26             res.add(new String(tmp));
27             return ;
28 
29         }
30         for(int i=1;i<=num.length();i++)
31         {
32             String cur=num.substring(0, i);
33             /**去除掉00X的结果,但是允许单个0*/
34             if(cur.length()>1&&cur.charAt(0)=='0')
35                 return;
36             /**因为有可能越界,所以使用long*/
37             long curnum=Long.parseLong(cur);
38             String sub=num.substring(i);
39             /**第一个数的话不用添加符号*/
40             if(tmp.length()==0)
41             {
42                 search(sub,target,cur,curnum,curnum);
43             }
44             else
45             {
46                 /**加法*/
47                 search(sub,target,tmp+"+"+curnum,cures+curnum,curnum);
48                 /**减法,注意当前结果值是-curnum*/
49                 search(sub,target,tmp+"-"+curnum,cures-curnum,-curnum);
50                 /**乘法*/
51                 search(sub,target,tmp+"*"+curnum,(cures-prenum)+prenum*curnum,prenum*curnum);
52             }
53         }
54     }
55 }

猜你喜欢

转载自www.cnblogs.com/kexinxin/p/10204976.html
今日推荐