class Solution {
int n;
int max;
int len;
Set<String> set = new HashSet<>();
public List<String> removeInvalidParentheses(String s) {
n = s.length();
int l = 0;
int r = 0;
for (int i = 0; i < n; i++) {
if(s.charAt(i)=='(')l++;
if(s.charAt(i)==')')r++;
}
max = Math.min(l,r);
dfs(0,"",0,s);
return new ArrayList<>(set);
}
public void dfs(int u ,String i,int score,String s){
if(score<0||score>max)return;
if(u==n){//遍历到最后一个字符
if(score==0 && i.length()>=len){
if(i.length()>len)set.clear();//如果当长度大于最大长度,之前的都不要
len = i.length();
set.add(i);
}
return;
}
char c = s.charAt(u);
if(c=='('){
dfs(u+1,i+c,score+1,s);
dfs(u+1,i,score,s);
}
else if(c==')'){
dfs(u+1,i+c,score-1,s);
dfs(u+1,i,score,s);
}else{
dfs(u+1,i+c,score,s);
}
}
}
思路来自于三叶
【宫水三叶】将括号的「是否合法」转化为「数学判定」 - 删除无效的括号 - 力扣(LeetCode) (leetcode-cn.com)