week31
301 - 删除无效的括号
class Solution {
public:
vector<string> res;
public:
vector<string> removeInvalidParentheses(string s) {
int l = 0, r = 0;
// 第一步:统计待删除的字符数量
for(auto x : s)
{
if(x == '(') l++;
else if (x == ')')
{
if(l == 0) r++;
else l--;
}
}
dfs(s, 0, "", 0, l, r);
return res;
}
void dfs(string& s, int u, string path, int cnt, int l, int r)
{
if(u == s.size())
{
if(!cnt) res.push_back(path); // 合法条件:左右括号数量一致
return;
}
if(s[u] != '(' && s[u] != ')') dfs(s, u + 1, path + s[u], cnt, l, r);
else if (s[u] == '(')
{
int k = u;
while(k < s.size() && s[k] == '(') k++;
// 按照数量枚举,先把所有的都删了
l -= k - u;
for(int i = k - u; i >= 0; i--)
{
if(l >= 0) dfs(s, k, path, cnt, l, r);
path += '(';
cnt++, l++; //
}
}
else if (s[u] == ')')
{
int k = u;
while(k < s.size() && s[k] == ')') k++;
r -= k - u;
for(int i = k - u; i >= 0; i--)
{
if(cnt >= 0 && r >= 0) dfs(s, k, path, cnt, l, r); // 注意这里的 cnt >= 0
path += ')';
cnt--, r++;
}
}
}
};303 - 区域和检索 - 数组不可变
304 - 二维区域和检索 - 数组不可变
306 - 累加数
307 - 区域和检索 - 数组可修改
309 - 最佳买卖股票时机含冷冻期
310 - 最小高度树

Last updated
