回溯法(遞歸實現) Leetcode括號生成 + 電話號碼

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;
	}
``
發佈了65 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章