栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode:20. 有效的括号

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode:20. 有效的括号

20. 有效的括号

来源:力扣(LeetCode)

链接: https://leetcode.cn/problems/valid-parentheses/

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

  • 1 <= s.length <= 1 0 4 10^4 104
  • s 仅由括号 ‘()[]{}’ 组成
解法
  • 暴力法:每次遍历一遍,如果是有相邻的两个是能够匹配的就将其替换成空字符,再接着从头开始遍历,直到最终判断这个字符串是否为空;
  • 栈: 这种结构非常适合栈的数据结构,如果是左括号就入栈,如果遍历碰到右括号,就与栈顶元素进行比较,看看是否能够匹配,如果不能匹配,则返回false;如果能够匹配,栈顶元素出栈,继续遍历;直到最后判断栈是否为空栈;
代码实现 暴力法

python实现

class Solution:
    def isValid(self, s: str) -> bool:
        n = len(s)
        if n & 1:
            return False
        
        count = 0
        while len(s) > 1:
            for i in range(len(s)-1):
                if s[i] == '(' and s[i+1] == ')' or s[i] == '[' and s[i+1] == ']' or s[i] == '{' and s[i+1] == '}':
                    s = s[:i] + s[i+2:]
                    count += 1
                    break
            if count == 0:
                return False
        return len(s) == 0

复杂度分析

  • 时间复杂度: O ( n 3 ) O(n^3) O(n3)
  • 空间复杂度: O ( 1 ) O(1) O(1)
栈

python实现

class Solution:
    def isValid(self, s: str) -> bool:
        n = len(s)
        if n & 1:
            return False
        
        maps = {')': '(', ']': '[', '}': '{'}
        stack = []

        for ch in s:
            if ch in maps:
                if not stack or stack.pop() != maps[ch]:
                    return False
            else:
                stack.append(ch)
        return len(stack) == 0

c++实现

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if (n & 1)
            return false;
        
        unordered_map maps = {
            {')', '('},
            {']', '['},
            {'}', '{'},
        };

        vector stack;
        for (char ch: s) {
            auto it = maps.find(ch);
            if (it != maps.end()) {
                if (stack.empty() || stack.back() != maps[ch])
                    return false;
                stack.pop_back();
            }
            else
                stack.push_back(ch);
        }
        return stack.empty();
    }
};

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968847.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号