import java.util.*;
/**
* NC255 最长有效的括号字符子序列
* @author d3y1
*/
public class Solution {
private ArrayList<String> list = new ArrayList<>();
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串一维数组
*/
public String[] maxValidParenthesesStr (String s) {
return solution(s);
}
/**
* 递归法(dfs): 栈
* @param s
* @return
*/
private String[] solution(String s){
// 待删除左括号数(多余)
int delL = 0;
// 待删除右括号数(多余)
int delR = 0;
// 达到最长括号字符子序列时 需要删除的左右括号数
for(char ch: s.toCharArray()){
if(ch == '('){
delL++;
}else if(ch == ')'){
if(delL > 0){
delL--;
}else{
delR++;
}
}
}
dfs(s, 0, delL, delR);
return list.toArray(new String[0]);
}
/**
* 递归
* @param seq
* @param start
* @param delL
* @param delR
*/
private void dfs(String seq, int start, int delL, int delR){
// 最长括号字符子序列
if(delL==0 && delR==0){
// 判断是否有效
if(isValid(seq)){
list.add(seq);
}
return;
}
char curCh;
for(int i=start; i<seq.length(); i++){
curCh = seq.charAt(i);
// 重复相同括号
if(i>start && seq.charAt(i)==seq.charAt(i-1)){
continue;
}
// 剩余不够删除
if(delL+delR > seq.length()-i){
return;
}
// 删除左括号
if(delL>0 && curCh=='('){
dfs(seq.substring(0,i)+seq.substring(i+1), i, delL-1, delR);
}
// 删除右括号
if(delR>0 && curCh==')'){
dfs(seq.substring(0,i)+seq.substring(i+1), i, delL, delR-1);
}
}
}
/**
* 是否有效
* @param seq
* @return
*/
private boolean isValid(String seq){
Stack<Character> stack = new Stack<>();
for(char ch: seq.toCharArray()){
if(ch == '('){
stack.push(ch);
}else if(ch == ')'){
if(stack.isEmpty() || stack.peek()!='('){
return false;
}
stack.pop();
}
}
return stack.isEmpty();
}
/**
* 是否有效(模拟栈)
* @param seq
* @return
*/
private boolean isOK(String seq){
int cnt = 0;
for(char ch: seq.toCharArray()){
if(ch == '('){
cnt++;
}else if(ch == ')'){
cnt--;
if(cnt < 0){
return false;
}
}
}
return cnt==0;
}
}