# Hard-题目9：301. Remove Invalid Parentheses

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())()”]
“)(” -> [“”]

“()())()” -> [“()()()”, “(())()”]
（这个例子中多了一个右括号，但有两种去掉右括号的方式，故最后答案有2个解）

public class Solution {
HashSet<String> visited = new HashSet<String>();
private int getMisses(String s) { // calculate the missing num of parentheses
int parentheses = 0;
int miss = 0;
for(int i = 0;i<s.length();i++) {
if(s.charAt(i) == '(')
parentheses++;
else if(s.charAt(i) == ')'){
if(parentheses==0)
miss++;
else
parentheses--;
}
}
miss+=parentheses;
return miss;
}
private void dfs(List<String> list, String s, int miss) {
if(miss == 0)
list.add(s);
else {
for(int i = 0;i<s.length();i++) {
String nextStr = removeCharAt(s, i);
if(!visited.contains(nextStr)) {
visited.add(nextStr);
int nextMiss = getMisses(nextStr);
if(nextMiss<miss)
dfs(list, nextStr, nextMiss);
}
}
}
}
private String removeCharAt(String s, int pos) {
return s.substring(0, pos) + s.substring(pos + 1);
}

public List<String> removeInvalidParentheses(String s) {
List<String> list = new ArrayList<String>();
dfs(list,s,getMisses(s));
return list;

}
}

23ms,beats 57.67%,众数3ms,13.37%
Cmershen的碎碎念：
3ms的办法也用到了递归，但不知道有没有回溯，在discuss https://leetcode.com/discuss/81478/easy-short-concise-and-fast-java-dfs-3-ms-solution中有介绍，但满篇E文让我懒得看，而博客中的中文分析大多与上述解法类似（我也是基于中文博客做的），还有一种基于bfs的，更慢且不易理解。

04-11 883

12-26 4624

04-19 1439

02-18 1012

12-25 3412

02-21 457

07-04 132

10-06 143

03-02 78

01-26 253