给表达式添加运算符
给定一个仅包含数字 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 }
原文地址:https://www.cnblogs.com/kexinxin/p/10204976.html
时间: 2024-11-13 07:36:24