class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (char c : s) {
if (c == '(' || c == '[' || c=='{') {
stk.push(c);
} else if (!stk.empty() && leftof(c)==stk.top()) {
stk.pop();
} else {
return false;
}
}
return stk.empty();
}
char leftof(char c) {
if (c == ')') return '(';
if (c == '}') return '{';
if (c == ']') return '[';
return c;
}
};
class Solution {
public:
vector<string> res;
bool is_vilid(const string& str) {
int balance = 0;
for (char c : str) {
if (c == '(') {
++balance;
} else {
--balance;
}
if (balance < 0) {
return false;
}
}
return balance == 0;
}
void dfs(string& path,int level,int n) {
if (level>n ) {
return;
}
if (level==n ) {
if (is_vilid(path)) res.emplace_back(path);
return;
}
string path_back = path;
path.append("(");
dfs(path,level+1,n);
path.pop_back();
path.append(")");
dfs(path,level+1,n);
path.pop_back();
}
vector<string> generateParenthesis(int n) {
string path = "";
dfs(path,0,n*2);
return res;
}
};
class Solution {
public:
int longestValidParentheses(string s) {
int res = 0;
int l_cnt =0;
int r_cnt = 0;
for(int i = 0; i < s.size();i++) {
if (s[i] == '(') l_cnt++;
else r_cnt++;
if (l_cnt==r_cnt) res = max(res,r_cnt*2);
if (l_cnt<r_cnt) l_cnt = r_cnt = 0;
}
r_cnt = l_cnt = 0;
for(int i = s.size()-1; i >= 0;i--) {
if (s[i] == '(') l_cnt++;
else r_cnt++;
if (l_cnt==r_cnt) res = max(res,r_cnt*2);
if (r_cnt<l_cnt) l_cnt = r_cnt = 0;
}
return res;
}
};
class Solution {
public:
set<string> res;
void dfs(string path,int level,string& s,int l_cnt, int r_cnt,int min_cnt) {
if (l_cnt < r_cnt || l_cnt> min_cnt || r_cnt>min_cnt || level>s.size()) return;
if (level == s.size()) {
if (l_cnt==r_cnt && l_cnt == min_cnt) {
res.insert(path);
}
}
char c = s[level];
if (c =='(') {
dfs(path+c,level+1,s,l_cnt+1,r_cnt,min_cnt);
dfs(path,level+1,s,l_cnt,r_cnt,min_cnt);
} else if (c == ')') {
dfs(path+c,level+1,s,l_cnt,r_cnt+1,min_cnt);
dfs(path,level+1,s,l_cnt,r_cnt,min_cnt);
} else {
dfs(path+c,level+1,s,l_cnt,r_cnt,min_cnt);
}
}
vector<string> removeInvalidParentheses(string s) {
int l_cnt = 0;
int r_cnt = 0;
for(auto c: s) {
if (c=='(') l_cnt++;
else if (c==')') { // )( 避免这种case
if (l_cnt > r_cnt) {
r_cnt++;
}
}
}
int min_cnt = min(l_cnt,r_cnt);
dfs("",0,s,0,0,min_cnt);
vector<string> out;
for(auto i : res) {
out.emplace_back(i);
}
return out;
}
};
class Solution {
public:
bool checkValidString(string s) {
int s_cnt = 0;
int l_cnt =0;
int r_cnt = 0;
for(int i = 0; i < s.size();i++) {
if (s[i] == '(') l_cnt++;
else if (s[i]==')') r_cnt++;
else s_cnt++;
if (l_cnt + s_cnt <r_cnt) return false;
}
s_cnt = r_cnt = l_cnt = 0;
for(int i = s.size()-1; i >= 0;i--) {
if (s[i] == '(') l_cnt++;
else if (s[i]==')') r_cnt++;
else s_cnt++;
if (r_cnt + s_cnt <l_cnt) return false;
}
return true;;
}
};
class Solution {
public:
int minAddToMakeValid(string s) {
int l_cnt =0;
int r_cnt = 0;
int res = 0;
for(int i = 0; i < s.size();i++) {
if (s[i] == '(') l_cnt++;
else r_cnt++;
if (r_cnt>l_cnt) {
res++;
l_cnt++;
}
}
r_cnt = l_cnt = 0;
for(int i = s.size()-1; i >= 0;i--) {
if (s[i] == '(') l_cnt++;
else r_cnt++;
if (l_cnt>r_cnt) {
res++;
r_cnt++;
}
}
return res;
}
};