# 0301. Remove Invalid Parentheses ###### tags: `Leetcode` `Hard` `FaceBook` `Backtracking` Link: https://leetcode.com/problems/remove-invalid-parentheses/ ## 思路 $O(N*2^N)$ 参考了[这里](https://leetcode.com/problems/remove-invalid-parentheses/discuss/75027/Easy-Short-Concise-and-Fast-Java-DFS-3-ms-solution)![](https://i.imgur.com/RuCaltP.png) 关于为什么需要lasti和lastj ![](https://i.imgur.com/VevCN7M.png) ## Code ```java= class Solution { public static List<String> removeInvalidParentheses(String s) { List<String> res = new ArrayList<>(); char[] check = new char[]{'(', ')'}; dfs(s, res, check, 0, 0); return res; } public static void dfs(String s, List<String> res, char[] check, int last_i, int last_j) { int count = 0; int i = last_i; while (i < s.length() && count>= 0) { if (s.charAt(i) == check[0]) count ++; if (s.charAt(i) == check[1]) count --; i ++; } if (count >= 0) { // no extra ')' is detected. We now have to detect extra '(' by reversing the string. String reversed = new StringBuffer(s).reverse().toString(); if (check[0] == '(') dfs(reversed, res, new char[]{')', '('}, 0, 0); else res.add(reversed); } else { // extra ')' is detected and we have to do something i -= 1; // 'i-1' is the index of abnormal ')' which makes count<0 for (int j = last_j; j<= i; j++) { if (s.charAt(j) == check[1] && (j == last_j || s.charAt(j-1) != check[1])) { dfs(s.substring(0, j) + s.substring(j+1, s.length()), res, check, i, j); } } } } } ```