[Leetcode]282. Expression Add Operators
[Leetcode]282. Expression Add Operators
解决方法是:
1. 用long,
2. 0开头的,除了0自己,都忽略不算,
3. 为了解决乘号优先级,例如2+3*2,顺序算的话,我们先算出来2+3=5,看到乘号,我们用5-3=2,恢复到之前,再算3*2=6,然后加上之前的2,6+2=8。我们设置两个变量,一个是curSum 上一步的和,一个是diff, 上一步末尾的计算的数,如果是乘以出来的结果,就是那个结果, 有负号的话记得把负号也连带着用上。curSum = 2, diff = 3, curSum = 5; 运算到遇到了乘号,就用(curSum - diff )+ diff*i。更新 curSum = 8, diff = diff * i, diff = 6. 如果2+3*2*2呢,继续用8 - 6 = 2,6*2 = 12, 12+2=14,我们的方法可以用,看着对对的。
以上难题都解决了呢,我们下一步看看如何实现。我一开始没思路的,很无耻的看了答案,答案上都说这个很明显用dfs,我就一脸懵逼了,哪里明显了?后来又一个良心答案说,题目让返回所有可能的解的组合,这就是让用dfs的意思。想来也颇有道理。我们要每次遍历到最后一个字符位置,确实是深度优先,然后每遍历一个字符,就要想在这一个字符和下一个字符之间要尝试所有的负号组合,如果想象成一个由数字组成的多叉树,就是一个tree的遍历,只不过每向下走一步,要尝试换符号。n方的复杂度,而且,没有更好的了。
做题的时候debug了一个bug一个小时,就是第一次初始化的时候,应该用y,我用了num,还有就是这个是从1,开始,到,length结束的。因为substring 闭开区间
AC Solution
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 -> []拿到题目完全没思路啊,想不到除了暴力拆解加暴力加各种符号之外更好的例子。能想到的两点就是小细节:1. 字符串这东西这么长,分分钟overflow啊,2.0开头的各种字符串应该不算吧,0自己除外,3. 有乘号,乘号优先级高,要是从前往后算的话要处理一下运算顺序才行。
解决方法是:
1. 用long,
2. 0开头的,除了0自己,都忽略不算,
3. 为了解决乘号优先级,例如2+3*2,顺序算的话,我们先算出来2+3=5,看到乘号,我们用5-3=2,恢复到之前,再算3*2=6,然后加上之前的2,6+2=8。我们设置两个变量,一个是curSum 上一步的和,一个是diff, 上一步末尾的计算的数,如果是乘以出来的结果,就是那个结果, 有负号的话记得把负号也连带着用上。curSum = 2, diff = 3, curSum = 5; 运算到遇到了乘号,就用(curSum - diff )+ diff*i。更新 curSum = 8, diff = diff * i, diff = 6. 如果2+3*2*2呢,继续用8 - 6 = 2,6*2 = 12, 12+2=14,我们的方法可以用,看着对对的。
以上难题都解决了呢,我们下一步看看如何实现。我一开始没思路的,很无耻的看了答案,答案上都说这个很明显用dfs,我就一脸懵逼了,哪里明显了?后来又一个良心答案说,题目让返回所有可能的解的组合,这就是让用dfs的意思。想来也颇有道理。我们要每次遍历到最后一个字符位置,确实是深度优先,然后每遍历一个字符,就要想在这一个字符和下一个字符之间要尝试所有的负号组合,如果想象成一个由数字组成的多叉树,就是一个tree的遍历,只不过每向下走一步,要尝试换符号。n方的复杂度,而且,没有更好的了。
做题的时候debug了一个bug一个小时,就是第一次初始化的时候,应该用y,我用了num,还有就是这个是从1,开始,到,length结束的。因为substring 闭开区间
AC Solution
public class Solution {
public List<String> addOperators(String num, int target) {
List<String> result = new ArrayList<String>();
helper(num, target, 0, 0, "", result);
return result;
}
public void helper(String num, int target, long curSum, long diff, String tempRes, List<String> res){
//System.out.println(curSum + ", " + num + ", " + tempRes);
if(num.length() == 0 && curSum == target){
res.add(tempRes);
return;
}
for(int i = 1; i<= num.length(); ++i){ // This part begin from 1, and end for <= ,becasue it is for substring[i,j)
String x = num.substring(0, i);
String y = num.substring(i);
if(x.length()>1 && x.charAt(0) =='0'){
return;
}
long cur = Long.parseLong(x);
if(tempRes.length()==0){
// First time go into this
helper(y, target, curSum + cur, cur, x, res);// 0 + whole number
}
else{
helper(y, target, curSum + cur, cur, tempRes + "+" + cur, res);
helper(y, target, curSum - cur, -cur, tempRes + "-" + cur, res);
helper(y, target, (curSum - diff) + diff * cur, diff * cur, tempRes + "*" + cur, res);
}
}
}
}
Comments
Post a Comment