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
}

猜你喜欢

转载自blog.csdn.net/m0_50945504/article/details/121004582