LeetCode 22. Generate Parentheses 題解 —— Java

題目鏈接:https://leetcode.com/problems/generate-parentheses/#/description

題目要求:給定正整數n,求n對括號所有正確配對的組合。

思路:採用分支限界和回溯算法,考慮一顆二叉樹,根節點爲(,向左走只添加左括號,向右走只添加有括號。在遍歷該二叉樹的時候,採用分支限界和回溯方法,只獲得滿足條件的括號對。


Java代碼如下:

public class Solution {

	private List<String> result;

	Solution() {
		result = new LinkedList<String>();
	}

	public List<String> generateParenthesis(int n) {
		String s = "";
		if (n > 0) {
			generateParenthsisHelper(s, n, 0, 0);
		}
		return result;
	}

	/**
	 * 生成括號對的方法
	 * @param s 一個括號對序列
	 * @param n 括號的對數
	 * @param left 左括號的個數
	 * @param right 右括號的個數
	 */
	public void generateParenthsisHelper(String s, int n, int left, int right) {
		// 如果總的節點個數達到了上限,表示一個括號對已經生成完畢
		if ((left + right) == 2 * n) {
			result.add(s);
			return;
		}
		// 如果左括號數量還不夠n,則添加一個左括號
		// 這個條件有點像剪枝條件,當左括號樹超過n之後,它之下的分支都不符合條件,因此可以剪去該枝
		if (left < n) {
			s += "(";
			// 然後遞歸的構造括號對
			generateParenthsisHelper(s, n, left + 1, right);
			// 回溯   舉例來說,當(((的情況處理完之後,回溯處理((的情況,當((的情況處理完之後,回溯處理(的情況
			s = s.substring(0, s.length() - 1);
		}
		if (right < left) {
			s += ")";
			generateParenthsisHelper(s, n, left, right + 1);
			s = s.substring(0, s.length() - 1);
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章