本文共 1858 字,大约阅读时间需要 6 分钟。
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.
Note: The input string may contain letters other than the parentheses (
and )
.
Examples:
“()())()” -> [“()()()”, “(())()”]
“(a)())()” -> [“(a)()()”, “(a())()”] “)(” -> [“”]
括号总是成对出现的,因此我们只需要记录尚未匹配的(
。
(
, 保留或者不保留。)
, 如果我们有未匹配的(
,则有两种选择;否则,只能不保留。因为我们要移除数量最少的括号,我们应该得到最大的匹配()
数量,注意下面两行的顺序。
dfs(str.substring(1), subRes + '(', countLeft + 1, maxLeft + 1);dfs(str.substring(1), subRes, countLeft, maxLeft);
它可以保证最长的结果出现在比它较短的结果前面。
Java:
// Runtime: 216 mspublic class Solution { private Listres = new ArrayList (); private int max = 0; public List removeInvalidParentheses(String s) { dfs(s, "", 0, 0); if (res.size() == 0) { res.add(""); } return res; } private void dfs(String str, String subRes, int countLeft, int maxLeft) { if (str.length() == 0) { if (countLeft == 0 && subRes.length() != 0) { if (maxLeft > max) { max = maxLeft; } if (max == maxLeft && !res.contains(subRes)) { res.add(subRes.toString()); } } return; } if (str.charAt(0) == '(') { dfs(str.substring(1), subRes.concat("("), countLeft + 1, maxLeft + 1); dfs(str.substring(1), subRes, countLeft, maxLeft); } else if (str.charAt(0) == ')') { if (countLeft > 0) { dfs(str.substring(1), subRes.concat(")"), countLeft - 1, maxLeft); } dfs(str.substring(1), subRes, countLeft, maxLeft); } else { dfs(str.substring(1), subRes.concat(String.valueOf(str.charAt(0))), countLeft, maxLeft); } }}
转载地址:http://ajjjo.baihongyu.com/