301. Remove Invalid Parentheses 发表于 2022-02-03 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859class Solution { public List<String> removeInvalidParentheses(String s) { int leftParentheses = 0, rightParentheses = 0, extraLeftParentheses = 0, extraRightParentheses = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '(') { leftParentheses++; extraLeftParentheses++; } else if (c == ')') { rightParentheses++; extraRightParentheses++; if (extraLeftParentheses > 0) { extraLeftParentheses--; extraRightParentheses--; } } } int maxScore = Math.min(leftParentheses, rightParentheses); int maxLength = s.length() - extraLeftParentheses - extraRightParentheses; Set<String> resultSet = new HashSet<>(); dfs(s, resultSet, "", 0, extraLeftParentheses, extraRightParentheses, 0, maxScore, maxLength); return new ArrayList<>(resultSet); } private void dfs(String s, Set<String> resultSet, String curr, int index, int extraLeftParentheses, int extraRightParentheses, int score, int maxScore, int maxLength) { if (extraLeftParentheses < 0 || extraRightParentheses < 0 || score < 0 || score > maxScore) { return; } if (extraLeftParentheses == 0 && extraRightParentheses == 0) { // 多余的括号刚好被抵消完,还需判断是否达到了最大长度,因为可能存在非括号字符 if (curr.length() == maxLength) { resultSet.add(curr); } } if (index == s.length()) { return; } char c = s.charAt(index); if (c == '(') { // 保留当前左括号 dfs(s, resultSet, curr + c, index + 1, extraLeftParentheses, extraRightParentheses, score + 1, maxScore, maxLength); // 不保留当前左括号,即将当前左括号丢弃 dfs(s, resultSet, curr, index + 1, extraLeftParentheses - 1, extraRightParentheses, score, maxScore, maxLength); } else if (c == ')') { // 保留当前右括号 dfs(s, resultSet, curr + c, index + 1, extraLeftParentheses, extraRightParentheses, score - 1, maxScore, maxLength); // 不保留当前右括号,即将当前右括号丢弃 dfs(s, resultSet, curr, index + 1, extraLeftParentheses, extraRightParentheses - 1, score, maxScore, maxLength); } else { // 始终保留英文字符 dfs(s, resultSet, curr + c, index + 1, extraLeftParentheses, extraRightParentheses, score, maxScore, maxLength); } }} Reference301. Remove Invalid Parentheses