首页 > 技术文章 > 删除无效的括号 -- LeetCode -- 10.27

rongrongrong 2021-10-27 15:34 原文

 删除无效的括号

给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。

返回所有可能的结果。答案可以按 任意顺序 返回。

 

示例 1:

输入:s = "()())()"
输出:["(())()","()()()"]

示例 2:

输入:s = "(a)())()"
输出:["(a())()","(a)()()"]

示例 3:

输入:s = ")("
输出:[""]

 暴力搜索yyds:

class Solution {
public:
    vector<string> ans;
    map<string, int> m;
    int n, k = -1, flag = 0;;
    string s1;
    void dfs(int index, string ss, int sum, int cnt){
        if(index == n){
            if((k == - 1 || cnt == k) && sum == 0){
                if(flag == 0){
                    flag = 1;
                    k = cnt;
                }
                if(m[ss] != 1){
                    ans.push_back(ss);
                    m[ss] = 1;
                }
            }
            return;
        }
        if(s1[index] == ')'){
            if(sum > 0){
                dfs(index + 1, ss + s1[index], sum - 1, cnt + 1);
                dfs(index + 1, ss, sum, cnt);
            }else{
                dfs(index + 1, ss, sum, cnt);
            }
        }else if(s1[index] == '('){
            dfs(index + 1, ss + s1[index], sum + 1, cnt + 1);
            dfs(index + 1, ss, sum, cnt);
        }else{
            dfs(index + 1, ss + s1[index], sum, cnt);
        }                
    }
    vector<string> removeInvalidParentheses(string s) {
        s1 = s;
        n = s.size();
        dfs(0, "", 0, 0);
        return ans;
    }
};

推荐阅读