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