leetcode打卡--301. 删除无效的括号(预处理的暴力枚举)

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode打卡--301. 删除无效的括号(预处理的暴力枚举)相关的知识,希望对你有一定的参考价值。

题目

OJ平台

解题思路

这题就是考察普通的暴力枚举得出答案。但问题是如何暴力枚举才能得出答案?

我们经过以下步骤便可完成解题:

  1. 预处理得出需要删除的左括号和右括号个数。
  2. 用dfs或者bfs进行每一步的删除枚举。(注意可以进行剪枝–每次如果出现相邻的相同字符,删除哪个得到的字符串都是一样的,所以可以continue)

解题代码

C++解决

class Solution {
public:
    vector<string>res;
    //最开始的l,r表示我们需要删除多少左括号和右括号才能得到正确的表达式
    //可以用bfs进行每一次的删除,也可以用dfs进行
    //dfs暴力枚举解决:每一次dfs表示选择一个位置的字符进行删除,然后进行下一次选择!
    //每一层dfs提供的选择就是字符串的长度,而每一次删除一个字符时,如果出现连续相同的字符,则删除得到的字符是等价的,所以需要把这种情况剪枝!
   void dfs(string& sb,int l,int r,int start){
        if(l==0&&r==0){
            if(isValid(sb)){
                res.push_back(sb);
            }
            return ;
        }
        int n = sb.size();
        for(int pos=start;pos<n;pos++){
            if(pos>0&&sb[pos]==sb[pos-1])
                continue;
            if(sb[pos]=='('&&l>0){
                string t = sb.substr(0,pos) +
                           sb.substr(pos+1,n-pos-1);
                dfs(t,l-1,r,pos);
            }else if(sb[pos]==')'&&r>0){
                string t = sb.substr(0,pos)+
                           sb.substr(pos+1,n-pos-1);
                dfs(t,l,r-1,pos);
            }
        }
    }
    bool isValid(string& s){
        int cnt = 0;
        for(auto&& t:s){
            if(t=='(')
                cnt++;
            if(t==')'){
                if(cnt>0)
                    cnt--;
                else
                    return false;
            }
        }
        return cnt == 0;
    }
    vector<string> removeInvalidParentheses(string s) {
        int l=0,r=0,sz = s.size();//l和r代表多出来的左括号和右括号数目
        for(int i=0;i<sz;i++){
            if(s[i]=='('){
                l++;
            }else if(s[i]==')'){
                if(l>0)
                    l--;
                else
                    r++;
            }
        }
        dfs(s,l,r,0);
        return res;
    }
};

Go语言解决

func removeInvalidParentheses(s string) []string {
    l,r:=0,0
    res:=[]string{}
    for _,v:=range s{
        if v=='('{
            l++
        }else if v==')'{
            if l==0{
                r++
            }else{
                l--
            }
        }
    }
    dfs(s,0,l,r,&res)
    return res
}

func dfs(s string,start,l,r int,res *[]string){
    if l==0 && r==0{
        if isValid(s){
            *res = append(*res, s)
        }
        return
    }

    for i:=start;i<len(s);i++{
        if i!=start && s[i]==s[i-1]{
            continue
        }

        if s[i]==')' && r>0{
            cur:=s
            cur = cur[:i]+cur[i+1:]
            dfs(cur,i,l,r-1,res)
        }else if s[i]=='(' && l>0{
            cur:=s
            cur = cur[:i]+cur[i+1:]
            dfs(cur,i,l-1,r,res)
        }
    }
}

func isValid(s string) bool{
    cnt:=0
    for _,v:=range s{
        if v=='('{
            cnt++
        }
        if v==')'{
            cnt--
        }
        if cnt<0{
            return false
        }
    }
    return cnt ==0
}

以上是关于leetcode打卡--301. 删除无效的括号(预处理的暴力枚举)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode困难301删除无效的括号

[LeetCode]301. 删除无效的括号(DFS)

LeetCode 301 删除无效的括号[dfs 字符串] HERODING的LeetCode之路

题目地址(301. 删除无效的括号)

LeetCode 496. 下一个更大元素 I / 301. 删除无效的括号 / 869. 重新排序得到 2 的幂

[leetcode]301. Remove Invalid Parentheses 去除无效括号