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;}
``