题目所属分类
合法的括号序列需要满足的条件 这个是要记住的
1)左右括号序列相同
2)括号序列中任意一个前缀 左括号数量要大于等于右括号数量
原题链接
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
代码案例:输入:s = “()())()”
输出:[“(())()”,“()()()”]
题解
l 表示当前左括号数量减去右括号数量
r 表示当前要删掉多少括号
循环结束后 l 表示的是要删的左括号数量
r 表示的是要删的右括号数量
要删除的左括号和右括号数
多看代码 dfs剪枝 加上这个判断是否合法
class Solution {
List<String> ans = new ArrayList<>();
public List<String> removeInvalidParentheses(String s) {
int l = 0 , r = 0 ;
for(char c : s.toCharArray()){
if(c == '(') l++ ;
else if(c == ')'){
if(l == 0) r++;
else l-- ;
}
}
dfs(s , 0 , l ,r);
return ans ;
}
public void dfs(String s , int u ,int l , int r ){
if(l == 0 && r == 0 &&check(s)){
ans.add(s);
return ;
}
char[] c = s.toCharArray();
for(int i = u ; i < c.length ; i++){
if(c[i] != '(' && c[i] != ')')continue;
if(i == u || c[i] != c[i-1]){
String t = s.substring(0 , i) + s.substring(i+1);
if(l > 0 && c[i] == '(')dfs(t , i , l - 1 ,r);
else if(r > 0 && c[i] == ')')dfs(t , i , l ,r -1 );
}
}
}
public boolean check(String s ){
int cnt = 0 ;
for(char c : s.toCharArray()){
if(c == '(') cnt++ ;
else if(c == ')')cnt -- ;
if(cnt < 0) return false ;
}
return cnt == 0 ;
}
}