classSolution { privatevoidgenerateParenthesis(List<String> parentheses, String str, int n) { if (n == 0) { if (!parentheses.contains(str)) { parentheses.add(str); } return; } intlength= str.length(); Set<String> newStrSet = newHashSet<>(); for (inti=0; i < length; i++) { Stringprefix= str.substring(0, i); Stringsuffix= str.substring(i); StringnewStr= prefix + "()" + suffix; // 剪枝,避免重复的搜索 if (newStrSet.contains(newStr)) { continue; } newStrSet.add(newStr); generateParenthesis(parentheses, newStr, n - 1); } } public List<String> generateParenthesis(int n) { List<String> result = newArrayList<>(); generateParenthesis(result, "()", n - 1); return result; } }
虽然这种递归使用了剪枝进行优化,但是仍然超时了。
尾部递归
由于上面的递归方式超时,所以需要换另一种方法。由于这种思路从理论上来讲是可行的,所以将尝试将递归改成尾部递归进行求解,同时,在求结果集时,不使用 List 及判重,直接使用 Set 增加新的元素,最后再将 Set 转成 List 返回。实验证明,使用尾部递归的效率远远高于前一种递归加剪枝方法效率。使用这种方法也能保证在时间限制范围内完成所有的求解。代码如下