1. 解题思路
1.1. 回溯问题
- 对串A逐个遍历, 且A中的每个元素都对应多个元素
- 回溯法说到底就是两个方法,一个主一个辅
- 主的搞异常处理和初始化
- 辅的搞递归: 自己递归自己
- 辅助函数自己分类递归,有多少个可能就调用递归多少次
- 确定什么时候递归到头: 本题是rnum和lnum都到了n;电话号码是待转化的str遍历结束了
1.2. 代码
class Solution {
private List<String> res=new ArrayList<String>();
private void traceBack(int lnum,int rnum,String str,int n) {
if(rnum==n)
res.add(str);
else if(lnum==n) {
while(rnum++!=n)
str+=")";
res.add(str);
}else if(rnum<lnum) {
traceBack(lnum+1, rnum, str+"(", n);
traceBack(lnum, rnum+1, str+")", n);
}else if(rnum==lnum)
traceBack(lnum+1, rnum, str+"(", n);
}
public List<String> generateParenthesis(int n) {
if(n<=0) return res;
traceBack(1, 0, "(", n);
return res;
}
}
2. 电话号码(递归实现)
2.1. 思路
2.2. 递归结束条件
if(leftChars.isEmpty()) {
res.add(comb);
return;
}
2.3. 代码
private List<String> res=new ArrayList<String>();
private void backAdd(String comb,String leftChars) {
if(leftChars==null) return;
if(leftChars.isEmpty()) {
res.add(comb);
return;
}else {
String letters=map.get(leftChars.charAt(0));
for(int i=0;i!=letters.length();i++) {
backAdd(comb+letters.charAt(i),leftChars.substring(1));
}
}
}
public List<String> letterCombinations(String digits) {
if(digits==null||digits.isEmpty()) return res;
backAdd(new String(),digits);
return res;
}
``