# 题目描述

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

# 题目解答

#### 代码实现

``````public class Solution {
/**
*类似广度优先遍历的思想
*/
public List<String> removeInvalidParentheses(String s){

List<String> ret = new ArrayList<>();
if(s == null)
return ret;
if(s.length() == 0){
return ret;
}

HashSet<String> visited = new HashSet<>();
ArrayDeque<String> queue = new ArrayDeque<>();
//找到了最小的就不再继续找，只需判断queue里剩余的元素
boolean founded = false;
while(!queue.isEmpty()){
String temp = queue.poll();
if(isValid(temp)){
founded = true;
}

//返回最小次数
if(founded)
continue;
//遍历所有状态
for(int i = 0; i < temp.length(); i++){
if(temp.charAt(i) != ')' && temp.charAt(i) != '(')
continue;
String splitStr = temp.substring(0, i) + temp.substring(i+1);
if(!visited.contains(splitStr)){
}
}
}
return ret;
}

/**
* 判断字符串的格式是否有效
* 方法非常巧妙
* 通过count来记录
*/
public boolean isValid(String s){

int count = 0;

for(int i = 0; i < s.length(); i++){
if('(' == s.charAt(i))
count++;
if(')' == s.charAt(i) && count-- == 0)
return false;
}

return count == 0;
}
}``````

1. Limit max removal `rmL` and `rmR` for backtracking boundary. Otherwise it will exhaust all possible valid substrings, not shortest ones.
2. Scan from left to right, avoiding invalid strs (on the fly) by checking num of `open` parens.
3. If it’s `(`, either use it, or remove it.
4. If it’s `)`, either use it, or remove it.
5. Otherwise just append it.
6. Lastly set StringBuilder to the last decision point.

In each step, make sure:

1. `i`does not exceed s.length().
2. Max removal `rmL` `rmR` and num of `open` parens are non negative.
3. De-duplicate by adding to a`HashSet`.
代码实现
``````public class Solution {
public List<String> removeInvalidParentheses(String s) {
if(s == null)
return new ArrayList<>();
int len = s.length();
int rmLeft = 0, rmRight = 0;
HashSet<String> temp = new HashSet<>();
StringBuilder sb = new StringBuilder();
//确定最大删除数量
for(int i = 0; i < len; i++) {
if(s.charAt(i) == '(') {
rmLeft++;
}
if(s.charAt(i) == ')') {
if(rmLeft != 0)
rmLeft--;
else
rmRight++;
}
}
DFS(temp, s, 0, rmLeft, rmRight, 0, sb);
return new ArrayList<>(temp);
}

public void DFS(HashSet<String> temp, String s, int i, int rmLeft, int rmRight, int open, StringBuilder sb) {
if(i == s.length() && rmLeft == 0 && rmRight == 0 && open == 0) {
return ;
}
if(i == s.length() || rmLeft < 0 || rmRight < 0 || open < 0)
return ;
int len = sb.length();
if(s.charAt(i) == '(') {
DFS(temp, s, i+1, rmLeft-1, rmRight, open, sb); // 删
DFS(temp, s, i+1, rmLeft, rmRight, open+1, sb.append('(')); //不删
}else if(s.charAt(i) == ')') {
DFS(temp, s, i+1, rmLeft, rmRight-1, open, sb);
DFS(temp, s, i+1, rmLeft, rmRight, open-1, sb.append(')'));
}else {
DFS(temp, s, i+1, rmLeft, rmRight, open, sb.append(s.charAt(i)));
}
//回溯
sb.setLength(len);
}
}``````

• 本文已收录于以下专栏：

## [leetcode] 301. Remove Invalid Parentheses 解题报告

• qq508618087
• 2015年12月26日 16:00
• 3944

## [LeetCode] Remove Invalid Parentheses

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all...
• u011331383
• 2015年11月09日 16:45
• 8213

## [leetcode] 301. Remove Invalid Parentheses

• u014673347
• 2016年02月18日 10:44
• 936

## 301. Remove Invalid Parentheses （Hard）

• wyh476901857
• 2017年04月11日 19:36
• 683

## C++实现——Remove Invalid Parentheses

//去掉最少的括号，使得字符串合理匹配 /* Remove the minimum number of invalid parentheses in order to make the input s...
• langmanqishizaijia
• 2016年04月10日 17:53
• 464

## 【Leetcode】301. Remove Invalid Parentheses 移除非法小括号

• u010900754
• 2017年02月21日 12:32
• 372

## leetcode -- Remove Invalid Parentheses--又是DFS,BFS的题目

https://leetcode.com/problems/remove-invalid-parentheses/valid parentheses definition字符串中的左右括号数应该相同，...
• xyqzki
• 2015年12月25日 17:00
• 3181

## 301. Remove Invalid Parentheses 去掉不合理的括号

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all...
• u010005161
• 2016年08月31日 16:10
• 229

## LeetCode 301 Remove Invalid Parentheses (BFS + 剪枝)

LeetCode 301 Remove Invalid Parentheses (BFS + 剪枝)
• Tc_To_Top
• 2016年10月08日 09:39
• 695

## java interface 学习

1. interface 中所有的方法都是 public  修饰的。
• luliangfeng
• 2014年08月12日 19:31
• 391

举报原因： 您举报文章：Remove Invalid Parentheses--Nice 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)