AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

LeetCode 301. 删除无效的括号

作者: 作者的头像   半醒的狐狸 ,  2023-02-27 20:59:12 ,  所有人可见 ,  阅读 14


0


23.02.27 学习

难是真的难,很长很麻烦
两个规则:
1. 满足合法括号的条件;
2. 对于连续重复括号,不考虑删除哪几个括号,枚举删除几个数量的括号

class Solution {
public:
// 合法括号满足的条件:
// 1. 左右括号数量相同;2. 任一前缀中,lr >= rc
// 搜索剪枝
    vector<string> res;

    vector<string> removeInvalidParentheses(string s) {
        int l = 0, r = 0;
        for (int i = 0; i < s.size(); i ++ ) {
            if (s[i] == '(') l ++ ;
            if (s[i] == ')') {
                if (l == 0) r ++ ;
                else l -- ;
            }
        }
        dfs(s, 0, "", 0, l, r);

        return res;
    }

    void dfs(string& s, int u, string ans, int cnt, int l, int r) {
        if (u == s.size()) {
            if (!cnt) {
                res.push_back(ans);
            }
            return ;
        }

        if (s[u] != '(' && s[u] != ')') dfs(s, u + 1, ans + 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, ans, cnt, l, r);  // 递归搜索
                ans += '(';  // 上面删了,下面的答案需要加上
                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 (r >= 0 && cnt >= 0) dfs(s, k, ans, cnt, l, r);
                ans += ')';
                cnt -- , r ++ ;
            }
        }
    }
};

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息