Leetcode之深度優先搜索(DFS)專題-301. 刪除無效的括號(Remove Invalid Parentheses)
刪除最小數量的無效括號,使得輸入的字符串有效,返回所有可能的結果。
說明: 輸入可能包含了除 (
和 )
以外的字符。
示例 1:
輸入: "()())()" 輸出: ["()()()", "(())()"]
示例 2:
輸入: "(a)())()" 輸出: ["(a)()()", "(a())()"]
示例 3:
輸入: ")(" 輸出: [""]
分析:需要以下三個步驟:
1、判斷需要刪除的括號的個數
2、刪除到錯誤個數為0
3、再次判斷序列是否合法,加入
AC代碼:
class Solution { public List<String> removeInvalidParentheses(String s) { //統計需要刪除多少個左右括號 int l = 0, r = 0; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '(') l++; else if (s.charAt(i) == ')') { if (l > 0) l--;//此時有左括號可以和右括號匹配 else r++;//此時右括號落單 } } List<String> res = new ArrayList<>(); dfs(s, 0, l, r, res); return res; } private void dfs(String s, int start, int l, int r, List<String> res) { //遞歸終止條件,沒有要刪除的左括號和右括號 //此時要判斷字符串是否合法,合法的話就加入結果中 if (l == 0 && r == 0) { if (isValid(s)) res.add(s); return; } for (int i = start; i < s.length(); i++) { if (i != start && s.charAt(i) == s.charAt(i - 1)) continue;//連續多個相同的括號只刪除第一個 if (s.charAt(i) == '(' || s.charAt(i) == ')') { String cur = s; cur = cur.substring(0,i) + cur.substring(i+1); if (r > 0 && s.charAt(i) == ')') dfs(cur, i, l, r - 1, res); else if (l > 0 && s.charAt(i) == '(') dfs(cur, i, l - 1, r, res); } } } private boolean isValid(String s) { int count = 0; char[] chars = s.toCharArray(); for (char ch : chars) { if (ch == '(') count++; if (ch == ')') count--; if (count < 0) return false; } return count == 0; } }