首页 > 其他分享 >leetcode: 有效的括号

leetcode: 有效的括号

时间:2023-05-27 19:31:52浏览次数:49  
标签:false 示例 复杂度 leetcode 括号 length 有效 stack

题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入: "()"

输出: true

示例 2:

输入: "()[]{}"

输出: true

示例 3:

输入: "(]"

输出: false

示例 4:

输入: "([)]"

输出: false

示例 5:

输入: "{[]}"

输出: true

20. 有效的括号

思路

使用栈,遍历输入字符串

如果当前字符为左半边括号时,则将其压入栈中

如果遇到右半边括号时,分类讨论:

1)如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环

2)若此时栈为空,则直接返回 false

3)若不为对应的左半边括号,反之返回 false

关键点解析

  • 栈的基本特点和操作

  • 可以用数组来模拟栈

比如 入: push 出:pop 就是栈。 入: push 出 shift 就是队列。 但是这种算法实现的队列在头部删除元素的时候时间复杂度比较高,可以参考一下双端队列。

算法流程

如果 c 是左括号,则入栈 push; 否则通过哈希表判断括号对应关系,若 stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 false.

复杂度分析

时间复杂度:$O(n)$,其中 nn 是字符串 ss 的长度。

空间复杂度:$O(n+∣Σ∣)$,其中 $Σ$ 表示字符集,本题中字符串只包含 66 种括号,$∣Σ∣=6$。栈中的字符数量为 $O(n)$,而哈希表使用的空间为 $O(∣Σ∣)$,相加即可得到总空间复杂度。

代码

const dict = {
    "(": ')',
    "[": "]",
    "{": "}"
}
var isValid = function (s) {
    const stack = []
    if (s.length % 2 !== 0) return false // 长度为奇数肯定错误
    for (let i = 0; i < s.length; i++) {
        if (dict[s[i]]) { // 是开头符号 入栈
            stack.push(s[i])
        } else {//是结尾符号
            if (stack.length === 0) return false
            if (dict[stack[stack.length - 1]] === s[i]) { //能合并则出栈
                stack.pop()
            } else { // 不能合并说明错误
                return false
            }
        }
    }
    return !stack.length  // 栈清空则表示全部合并完成
};

标签:false,示例,复杂度,leetcode,括号,length,有效,stack
From: https://blog.51cto.com/codeniu/6362926

相关文章

  • 武汉星起航:亚马逊高效选品指南分享,助力卖家有效提升销量
    在亚马逊平台上选择合适的产品是一个关键的成功因素。高效选品不仅可以帮助亚马逊卖家实现销售增长,还可以降低竞争压力并提高盈利能力。武汉星起航将为亚马逊卖家提供一些高效选品的策略和指南。市场研究和分析:在选择产品之前,进行充分的市场研究和分析是至关重要的。了解当前市场趋......
  • 【LeetCode】203. 移除链表元素
    203.移除链表元素思路一:直接删除法(迭代)1.从头结点开始向后遍历,找到等于val的结点;2.假设cur->val=val,那么要让cur的前一个结点prev的next指针指向cur的下一个结点,即prev->next=cur->next。要注意的是当头结点的值等于val时(head->val=val),因为头节点没有前一个结点,所以可......
  • 一个用栈实现的括号匹配
    #include<iostream>#include<cstring>#include<stack>usingnamespacestd;intmain(){stringinput;cin>>input;inta=input.length();stack<char>stk;if(a%2!=0){cout<<"False"&......
  • LeetCode 114. 二叉树展开为链表
    思路1classSolution{public:voidflatten(TreeNode*root){while(root){autop=root->left;if(p)//找到左儿子的右链{while(p->right)p=p->right;//将右链插入......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树展开为链表
    题目:给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。 示例1:输入:root=[1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,......
  • 智慧水务系统如何进行有效的数据架构整改?三个企业的改造实践分享
    在智慧水务系统中,往往需要对设备中产生的液位、电流、水量等实时指标数据进行存储、分析及监控操作,而这些都是典型的时序数据。面对这些数据的处理时,很多企业在前期选择的大都是传统的实时数据库甚至关系型数据库,随着设备数量的增加,数据量也达到了百万、千万量级,传统的数据库解决......
  • 专业解读财务共享实现财务数智化转型的有效路径
    近年来,随着数字经济的飞速发展,各大企业全面开启数智化转型之路,作为企业数智化转型的重要内容,财务数智化转型始于财务共享服务。然而,财务共享建设并不是一蹴而就的,如何通过财务共享实现财务数智化转型,推进业财深度融合,成为各大企业重要的研究课题。财务共享实现财务数智化转型的有效......
  • #yyds干货盘点# LeetCode程序员面试金典:路径总和 II
    题目:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。 示例1:输入:root=[5,4,8,11,null,13,4,7,2,null,null,5,1],targetSum=22输出:[[5,4,11,2],[5,8,4,5]]示例2:输入:root=......
  • #yyds干货盘点# LeetCode程序员面试金典:多数元素
    1.描述:给定一个大小为n的数组 nums,返回其中的多数元素。多数元素是指在数组中出现次数大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:22.代码实现:classSolution{......
  • Leetcode2585. 获得分数的方法数
    题解多重背包的模板f[i][j]表示前i种题目得分为j的方案数f[i][j]+=f[i-1][j-kw]再将空间优化为1维classSolution{publicintwaysToReachTarget(inttarget,int[][]types){intn=types.length,MOD=(int)1e9+7,INF=0x3f3f3f3f;int[......