首页 > 其他分享 >LeetCode 2116. 判断一个括号字符串是否有效

LeetCode 2116. 判断一个括号字符串是否有效

时间:2023-06-08 22:11:55浏览次数:47  
标签:locked java util 括号 字符串 import LeetCode 2116

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * 一个括号字符串是只由 '(' 和 ')' 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:
 * 
 * 字符串为 ().
 * 它可以表示为 AB(A 与 B 连接),其中A 和 B 都是有效括号字符串。
 * 它可以表示为 (A) ,其中 A 是一个有效括号字符串。
 * 
 * 给你一个括号字符串 s 和一个字符串 locked ,两者长度都为 n 。locked 是一个二进制字符串,只包含 '0' 和 '1' 。对于
 * locked 中 每一个 下标 i :
 * 
 * 如果 locked[i] 是 '1' ,你 不能 改变 s[i] 。
 * 如果 locked[i] 是 '0' ,你 可以 将 s[i] 变为 '(' 或者 ')' 。
 * 
 * 如果你可以将 s 变为有效括号字符串,请你返回 true ,否则返回 false 。
 * 
 * 示例 1:
 * 输入:s = "))()))", locked = "010100"
 * 输出:true
 * 解释:locked[1] == '1' 和 locked[3] == '1' ,所以我们无法改变 s[1] 或者 s[3] 。
 * 我们可以将 s[0] 和 s[4] 变为 '(' ,不改变 s[2] 和 s[5] ,使 s 变为有效字符串。
 * 
 * 示例 2:
 * 输入:s = "()()", locked = "0000"
 * 输出:true
 * 解释:我们不需要做任何改变,因为 s 已经是有效字符串了。
 * 
 * 示例 3:
 * 输入:s = ")", locked = "0"
 * 输出:false
 * 解释:locked 允许改变 s[0] 。
 * 但无论将 s[0] 变为 '(' 或者 ')' 都无法使 s 变为有效字符串。
 */
public class Solution18 {
    /**
     * 首先排除掉字符个数为奇数的情况,再从头遍历一次不可修改的右括号,从尾遍历一次不可修改的左括号,看是否能构成有效字符串就行了。
     * 没搞懂,看的题解
     * @param s
     * @param locked
     * @return
     */
    public boolean canBeValid(String s, String locked) {
        int n=s.length(),l=0,r=0;
        if(n%2==1) return false;
        for(int i=0;i<n;i++){
            if(locked.charAt(i)=='1'&&s.charAt(i)==')'){
                r++;
                //  i+1-r<r: 从左到右访问到第i个字符,是不可更改的右括号,这样的右括号出现次数为r,那它的左边[0...i]最多有i+1-r个左括号,
                // 左括号数量小于右括号的话,return false n-i-l<l
                if(i+1-r<r) return false;
            }
        }
        for(int i=n-1;i>=0;i--){
            if(locked.charAt(i)=='1'&&s.charAt(i)=='('){
                l++;
                if(n-i-l<l) return false;
            }
        }
        return true;

    }

    public static void main(String[] args) {
        boolean f = new Solution18().canBeValid("())(()(()(())()())(())((())(()())((())))))(((((((())(()))))(",
                "100011110110011011010111100111011101111110000101001101001111");
        System.out.println(f);
    }
}

标签:locked,java,util,括号,字符串,import,LeetCode,2116
From: https://www.cnblogs.com/snolin/p/17467819.html

相关文章

  • LeetCode 剑指 Offer 65. 不用加减乘除做加法
    /***写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“*”、“/”四则运算符号。*<p>*示例:*输入:a=1,b=1*输出:2*<p>*提示:*a,b均可能是负数或0*结果不会溢出32位整数**00000001*00000101**进位和0......
  • LeetCode----回溯
    1算法模板for选择in选择列表:#做选择将该选择从选择列表移除路径.add(选择)backtrack(路径,选择列表)#撤销选择路径.remove(选择)将该选择再加入选择列表2代码示例46.全排列classSolution:def__init__(self):se......
  • LeetCode----前缀和
    1算法原理适用场景:利用preSum数组,可以在O(1)的时间内快速求出nums任意区间[i,j]内的所有元素之和sum(i,j)=preSum(j+1)-preSum[i]算法模板classNumArray:def__init__(self,nums:List[int]):N=len(nums)self.preSum=[0]*(N+1)......
  • LeetCode----二维网格DFS
    1算法模板voiddfs(int[][]grid,intr,intc){//判断basecase//如果坐标(r,c)超出了网格范围,直接返回if(!inArea(grid,r,c)){return;}//访问上、下、左、右四个相邻结点dfs(grid,r-1,c);dfs(grid,r+1,c);......
  • 【Leetcode】5-最长回文子串
    1.一般方法:暴力for循环求解,时间复杂度,空间复杂度。2.动态规划:我们发现在匹配过程中有许多重复计算的部分,我们把这些放到一个表里保存起来会减少运算,用空间换时间。时间复杂度,空间复杂度。例如“babab”字符串对应的表为:dp[i][j]为TRUE代表字符串从i到j为回文串。判断i到j是否为回文......
  • [LeetCode] 1351. Count Negative Numbers in a Sorted Matrix
    Givena mxn matrix grid whichissortedinnon-increasingorderbothrow-wiseandcolumn-wise,return thenumberof negative numbersin grid.Example1:Input:grid=[[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]Output:8Explanation:Thereare......
  • 递归-二叉搜索树-leetcode98验证二叉搜索树
    //leetcodesubmitregionbegin(Prohibitmodificationanddeletion)/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=......
  • LeetCode 90. 子集 II
    classSolution{public:unordered_map<int,int>cnt;vector<vector<int>>res;vector<int>path;vector<vector<int>>subsetsWithDup(vector<int>&nums){for(autoi:nums)cnt......
  • 【leetcode】21. Merge Two Sorted Lists
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]提示:两个链表的节点数目范围是[0,......
  • Leetcode 2611. 老鼠和奶酪
    题目:有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉。下标为i 处的奶酪被吃掉的得分为:如果第一只老鼠吃掉,则得分为 reward1[i] 。如果第二只老鼠吃掉,则得分为 reward2[i] 。给你一个正整数数组 reward1 ,一个正整数数组 reward2 ,和一个非负整......