• LeetCode:有效的括号


    题目内容


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

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

    注意空字符串可被认为是有效字符串。
    示例 1:

    输入: "()"
    输出: true
    

    示例 2:

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

    示例 3:

    输入: "(]"
    输出: false
    

    示例 4:

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

    示例 5:

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

    解题

    解题思路

    除了“(]”不允许 “([)]” 也不允许
    有开括就得有闭括,而且最先开的括必须最后闭合
    解决办法每次遍历到是闭括号时,校验上一个开括是否为当前类型的
    这样可以采用栈的数据结构来完成,每次开括就存入栈,闭括就取出栈顶元素判断是否为同种类的开括如果不是就返回false

    代码实现

    public class Solution {
        public bool IsValid(string s) {
            var stock = new Stack<char>();
            foreach (var c in s)
            {
                //判断是否为开括
                if (c == '(' || c == '[' || c == '{')
                {
                    //存入栈
                    stock.Push(c);
                }
                else
                {
                    //如果栈中不存在开括就就直接返回false
                    if (stock.Count == 0) return false;
                    //判断是那种闭括
                    if (c == ')')
                    {
                        //判断上一个开括是否与当前这个闭括匹配,如果不匹配就返回false
                        if (stock.Pop() != '(') return false;
                    }
                    else if (c == ']')
                    {
                        //判断上一个开括是否与当前这个闭括匹配,如果不匹配就返回false
                        if (stock.Pop() != '[') return false;
                    }
                    else
                    {
                        //判断上一个开括是否与当前这个闭括匹配,如果不匹配就返回false
                        if (stock.Pop() != '{') return false;
                    }
                }
            }
    
            //如果栈中还有开括就直接返回false
            return stock.Count == 0;
        }
    }
    

    改进

    改进思路

    上面还有几个地方可以进行优化下
    在判断是否为开括号的时候可以将他们存入字典,并返回相对应的括回符号
    判断括回时候就只需要从栈中取出元素,判断字符是否相同即可
    设置栈默认大小为:字符串长度/2这样可以减少栈扩容次数

    代码实现

    public class Solution {
        /// <summary>
        /// 映射
        /// </summary>
        private static readonly char[] Mapper;
    
        static Solution()
        {
            //创建映射
            Mapper = new char[126];
            Mapper['('] = ')';
            Mapper['['] = ']';
            Mapper['{'] = '}';
        }
        public bool IsValid(string s)
        {
            //上面还有几个地方可以进行优化下
            //在判断是否为开括号的时候可以将他们存入字典,并返回相对应的括回符号
            //判断括回时候就只需要从栈中取出元素,判断字符是否相同即可
            //设置栈默认大小为:字符串长度/2这样可以减少栈扩容次数
            var stock = new Stack<char>(s.Length / 2);
            foreach (var c in s)
            {
                var item = Mapper[c];
                if (item == char.MinValue)
                {
                    if (stock.Count == 0 || stock.Pop() != c) return false;
                }
                else
                {
                    stock.Push(item);
                }
            }
    
            //如果栈中还有开括就直接返回false
            return stock.Count == 0;
        }
    }
    
  • 相关阅读:
    【JVM性能调优】检测最耗cpu的线程的脚本
    JUC之ThreadPoolExecutor实现原理
    HashMap实现原理
    JUC之阻塞队列BlockingQueue的实现原理
    dubbo实践
    .net 技术基础
    日志等级
    CentOS 笔记(六) 历史命令 自动补充
    CentOS 笔记(五) 常用工具
    CentOS 笔记(二) 端口占用,进程查看
  • 原文地址:https://www.cnblogs.com/liuzhenliang/p/LeetCode-ValidParenthesis.html
Copyright © 2020-2023  润新知