39. 组合总和
1.本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制
2.除了等于target要返回,大于target也不需要再往下搜索
3.如何剪枝?先排序,再剪枝。
排序:Arrays.sort(candidates);
剪枝:
for(int i=s;i<c.length;i++)
{
if(sum+c[i]>t) break;
path.add(c[i]);
sum=sum+c[i];
backtracking(c,t,i);
path.removeLast();
sum=sum-c[i];
}
40.组合总和II
1.首先排序,使相同元素相邻。
2.树层去重
while(i!=c.length-1&&c[i]==c[i+1]) i++;
for(int i=s;i<c.length;i++)
{
if(sum+c[i]>t) break;
path.add(c[i]);
sum=sum+c[i];
backtracking(c,t,i+1);
sum=sum-c[i];
path.removeLast();
while(i!=c.length-1&&c[i]==c[i+1]) i++;
}
131.分割回文串
其实切割问题类似组合问题。
例如对于字符串abcdef:
- 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个.....。
- 切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段.....。
-
for(int i=start;i<s.length();i++) { String t=s.substring(start,i+1); if(pd(t)) { path.add(t); backtracking(s,i+1); path.removeLast(); } }
String t=s.substring(start,i+1);即为切割下来的字串。