刘旭的个人网站

题目链接

https://leetcode-cn.com/problems/generate-parentheses/

解答过程

这个题目需要计算n组括号组成的字符串中,满足括号开闭语法规则的字符串。最简单直接的做法就是遍历所有可能组成的字符串,并判断每个字符串是否满足开闭语法规则。这种遍历所有可能,并过滤合法解,已经是使用回溯法的强暗示。从代码来看,非常简洁,通过判断开闭括号剩余数的关系完成剪枝,通过控制开闭括号的添加顺序保证满足语法规则。思路有一点讨巧,但是很好理解,同时很好地体现了回溯的思想。

	public List<String> generateParenthesis(int n) {
		List<String> res = new ArrayList<>();

		backtrack(res, n, n, new String());

		return res;
	}

	private void backtrack(List<String> res, int openLeft, int closeLeft, String s) {
		if (openLeft == 0 && closeLeft == 0) {
			res.add(s);
			return;
		}

		if (openLeft > closeLeft) {
			return;
		}

		if (openLeft > 0) {
			backtrack(res, openLeft-1, closeLeft, s + "(");
		}

		if (closeLeft > 0) {
			backtrack(res, openLeft, closeLeft-1, s + ")");
		}
	}