282. 给表达式添加运算符
给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。
示例 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
输出: []
解题思路
- 使用递归的方法,生成所有可能产生的表达式
- 利用基本计算器的代码,计算出所有表达式的值,找出满足题意的表达式
代码
class Solution {
List<String> res=new ArrayList<>();
int t;
public List<String> addOperators(String num, int target) {
t=target;
int c=0;
for (int i=0;i<num.length()-1;i++)
{
c=(c*10)+num.charAt(i)-'0';
operator(num,i+1,""+c);
if (i==0&&num.charAt(i)=='0')
break;
}
if(num.equals(""+target))
res.add(num);
return res;
}
public long calculate(String s) {
Stack<Long> stack=new Stack<>();
Stack<Long> characterStack=new Stack<>();
int n=s.length();int i = 0,sign=1,cur=0;
while ( i < n) {
char c = s.charAt(i);
if(c==' ')
{
i++;
continue;
}
if(Character.isDigit(c))
{
long sum=0;
while (i < n&&Character.isDigit(s.charAt(i)))
{
sum*=10;
sum+=s.charAt(i)-'0';
i++;
}
stack.push(sum);
i--;
}else {
if(c=='+'||c=='-')
{
if(!characterStack.isEmpty())
{
stack.push(stack.pop()*characterStack.pop()+stack.pop());
}
characterStack.push(c=='+'?1L:-1L);
}
else
{
int sum=0;
i++;
while (s.charAt(i)==' ') i++;
while (i < n&&Character.isDigit(s.charAt(i)))
{
sum*=10;
sum+=s.charAt(i)-'0';
i++;
}
if(c=='*')
stack.push(stack.pop()*sum);
else
stack.push(stack.pop()/sum);
i--;
}
}
i++;
}
return stack.size()==1?stack.pop():stack.pop()*characterStack.pop()+stack.pop();
}
public void operator(String num, int s,String sb) {
if (s==num.length())
{
if (calculate(sb)==t)
res.add(sb);
return;
}
int c=0;
for (int i=s;i<num.length();i++)
{
c=(c*10)+num.charAt(i)-'0';
operator(num,i+1,sb+"+"+c);
operator(num,i+1,sb+"-"+c);
operator(num,i+1,sb+"*"+c);
if (i==s&&num.charAt(i)=='0')
break;
}
}
}