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 )
.
Example 1:
Input: "()())()" Output: ["()()()", "(())()"]
Example 2:
Input: "(a)())()" Output: ["(a)()()", "(a())()"]
Example 3:
Input: ")(" Output: [""]
要点:1 、第一轮先检查右括号的有效性,第二轮检查左括号的有效性,经过两轮检查后才得到有效的值
2、每一次只需要上次未遍历的地方开始遍历
3、last_remove记录上次删除的索引,只会从last_remove向后删除,以防止得到重复字符串,否则可能会出现下面的例子中删掉位置1,3和删掉位置3,1这种只是删除时间不同,但是结果相同的情况
4、因为可能存在以下例子中位置3,4相同‘)’的情况,故只对连续相同的中的第一个进行处理,以免得到重复字符串
01234567
( )( ) ) ( ) )
class Solution {
public List<String> removeInvalidParentheses(String s) {
List<String> res = new ArrayList<>();
if(s==null) return res;
remove(res,s,0,0,new char[]{'(',')'});
return res;
}
public void remove(List<String> res,String s,int last_index,int last_remove,char[] par){
int count = 0;
for(int i=last_index;i<s.length();i++){
if(s.charAt(i)==par[0]) count++;
if(s.charAt(i)==par[1]) count--;
if(count>=0) continue;
for(int j=last_remove;j<=i;j++){
if(s.charAt(j)==par[1]&&(j==last_remove || s.charAt(j-1)!=s.charAt(j))){
remove(res,s.substring(0,j)+s.substring(j+1,s.length()),i,j,par);
}
}
return;//当程序执行到这里,证明s在一侧具有无效括号,并且在以上步骤中去除并继续执行下去,而此循环已经没有执行的必要,并且以下程序也没有资格执行下去,故用return
}
String reverseStr = new StringBuilder(s).reverse().toString();
if(par[1]==')'){
remove(res,reverseStr,0,0,new char[]{')','('});
}
else
res.add(reverseStr);
}
}