LeetCode有效的括号

78 阅读2分钟

一、有效的括号

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

有效字符串需满足:

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

二、思路解法

采用栈的思想(先进后出)来解决

public static bool IsValid(string s)
        {
            //创建一个栈
            Stack stack = new Stack();
            //字符串转化成字符数组
            char[] chars = s.ToCharArray();
            //循环遍历字符串每一个字符
            for(int i =  0; i < chars.Length;i++)
            {
                bool single1 = chars[i] == '(';
                bool single2 = chars[i] == '{';
                bool single3 = chars[i] == '[';
                //如果满足符号({[,则将他们存入栈内
                if (single1 || single2 || single3)
                {
                    stack.Push(chars[i]);
                }
                else
                {
                    //栈为空,则返回FALSE
                    if (stack.Count == 0)
                    {
                        return false;
                    }
                    else//栈不为空
                    {
                        //弹出栈顶元素
                        char temp= (char)stack.Pop();
                        if (chars[i] == ')')
                        {
                            if (temp != '(')
                            {
                                return false;
                            }
                        }else if (chars[i] == '}')
                        {
                            if (temp != '{')
                            {
                                return false;
                            }
                        }else if (chars[i] == ']')
                        {
                            if (temp != '[')
                            {
                                return false;
                            }
                        }
                    }
                }
            }
            return stack.Count == 0?true:false;
        }

这段代码的主要思路就是:首先将字符串转化为字符数组,方便后续的每个字符的遍历,在for循环里面,当字符为“(”,“{”,“【”等符号的时候进行入栈操作。如果不是这三项符号的话,我首先会判断当前栈是否为空,为空则返回FALSE,如果不为空,我先取出当前栈的栈顶元素进行三项判断比较,当左符号和右符号不匹配的时候我就返回FALSE,循环最后结束后,我们判断栈顶是否是空,为空说明全部括号都匹配到了,如果不为空表示还有括号未进行匹配,这时候返回FALSE,最终得以解决这个问题。 三、测试代码:

            string s = "(]";
            bool flag = IsValid(s);
            Console.WriteLine(flag);