首页 > 其他分享 >LeetCode 301. 删除无效的括号

LeetCode 301. 删除无效的括号

时间:2023-07-18 13:12:05浏览次数:39  
标签:cnt 括号 int 301 dfs ++ path LeetCode

class Solution {
public:
    vector<string> ans;
    vector<string> removeInvalidParentheses(string s) {
        //lr分别记录要删除的左右括号数量
        int l=0,r=0;
        for(auto c:s)
            if(c=='(')  l++;
            else if(c==')')
            {
                if(l==0)    r++;
                else l--;
            }
        dfs(s,"",0,l,r);
        return ans;
    }
    bool check(string s)
    {
        int cnt = 0,n = s.length();
        for(int i = 0 ; i < n ; i ++)
        {
            if(s[i] =='(') cnt ++;
            else if(s[i] == ')') cnt --;
            if(cnt < 0) return false;
        }
        return cnt == 0;
    }
    void dfs(string s,string path,int u,int l,int r)//枚举删除哪些括号
    {
        int n=s.size();
        if(u>=n)
        {
            if(check(path))
                ans.push_back(path);
            return;
        }
        if(s[u]=='(')
        {
            //找出连续括号数量
            int t=u;
            while(t<n&&s[t]=='(')   t++;
            //倒序枚举删除的数量
            l-=t-u;
            for(int i=t-u;i>=0;i--)
            {
                if(l>=0)
                    dfs(s,path,t,l,r);
                path=path+'(';
                l++;
            }
        }
        else if(s[u]==')')
        {
            //找出连续括号数量
            int t=u;
            while(t<n&&s[t]==')')   t++;
            //倒序枚举删除的数量
            r-=t-u;
            for(int i=t-u;i>=0;i--)
            {
                if(r>=0)
                    dfs(s,path,t,l,r);
                path=path+')';
                r++;
            }
        }
        else//当前不是括号,直接递归下一步    
            dfs(s,path+s[u],u+1,l,r);
    }
};

标签:cnt,括号,int,301,dfs,++,path,LeetCode
From: https://www.cnblogs.com/tangxibomb/p/17562633.html

相关文章

  • 8-102-(LeetCode- 207&210) 课程表II
    1.题目读题210. 课程表II 考查点 2.解法思路 这道题的解答思路是使用拓扑排序来判断有向图是否有环,如果有环,说明无法完成所有课程,如果没有环,输出拓扑排序的结果。拓扑排序的基本思想是从有向图中选择一个没有前驱(即入度为0)的顶点并输出,然后从图中删除该顶点和所......
  • LeetCode 287. 寻找重复数
    classSolution{public:intfindDuplicate(vector<int>&nums){if(nums.size()<2)returnnums[0];intn=nums.size();intfast=0,slow=0;do{slow=nums[slow];fast=nums[fast......
  • LeetCode 热题 100 之 160. 相交链表
    题目描述给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。自定义评测:评测......
  • LeetCode 热题 100 之 15. 三数之和
    题目描述给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。示例1:输入:nums=[-1,0,1,2,-......
  • LeetCode 热题 100 之 11. 盛最多水的容器
    题目描述给定一个长度为n的整数数组 height 。有 n 条垂线,第i条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3......
  • LeetCode 周赛上分之旅 #33 摩尔投票派上用场
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和[BaguTreePro]知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告......
  • #yyds干货盘点# LeetCode程序员面试金典:分数到小数
    题目:给定两个整数,分别表示分数的分子 numerator和分母denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回任意一个。对于所有给定的输入,保证答案字符串的长度小于104。 示例1:输入:numerator=1,denominator......
  • leetcode day4 24 19 面试题02.07 142
    目录24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题02.07.链表相交14224.两两交换链表中的节点if(head==nullptr||head->next==nullptr){returnhead;}//ans指针,永远指向head,返回值ListNode*ans=newListN......
  • LeetCode 658. Find K Closest Elements 二分+双指针
    Givenasortedintegerarrayarr,twointegerskandx,returnthekclosestintegerstoxinthearray.Theresultshouldalsobesortedinascendingorder.Anintegeraisclosertoxthananintegerbif:|a-x|<|b-x|,or|a-x|==|b-x|an......
  • LeetCode 21.合并两个有序链表
    题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]classSolution(object):defmerg......