282. Expression Add Operators
题目链接:https://leetcode.com/problems...
动态规划问题,最后要求全部满足条件的path。subproblem是:dp[i]: possible sum of s[0, i+1]
,function是:dp[i] = dp[i-k] + (-prev + prev*cur, +cur, -cur)
注意s[i-k+1]如果等于0,那么k只能等于1
,如果有除的时候也不能是0,开头的数字单独处理,因为前面没有符号,dfs来解。还有个问题是取数字的时候可能 超过int的范围,用long来处理。
public class Solution {
public List<String> addOperators(String num, int target) {
List<String> res = new ArrayList();
dfs(res, num, "", 0, 0, target, 0);
return res;
}
private void dfs(List<String> res, String num, String path, int dep, long sum, int target, long prev) {
if(dep == num.length()) {
if(sum == target) res.add(path);
return;
}
for(int i = dep; i< num.length(); i++) {
// 0 can not be the start of number if more than 2 digits
if(num.charAt(dep) == '0' && i > dep) break;
long cur = Long.parseLong(num.substring(dep, i+1));
if(dep == 0) dfs(res, num, path+cur, i+1, cur, target, cur);
else {
dfs(res, num, path + "+" + cur, i+1, sum+cur, target, cur);
dfs(res, num, path + "-" + cur, i+1, sum-cur, target, -cur);
dfs(res, num, path + "*" + cur, i+1, sum-prev+prev*cur, target, prev*cur);
// if(cur != 0) dfs(res, num, path + "/" + cur, i+1, sum-prev+prev/cur, target, prev/cur);
}
}
}
}
divide and conquer的做法,讨论切分点从left+1到right,本质和dfs做法是一样的,复杂度也不会降低。参考:
http://bookshadow.com/weblog/...
关于memo的,这里应该记的是suffix已经算过的所有值,也就是说把所有s[i+1:]
可能的所有值和相应的path存在一个hashmap里面。关键是求suffix值,又变成原来的问题了,所以这题感觉不能加memo。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。