LeetCode第20题:有效的括号

283 阅读3分钟

LeetCode第20题:有效的括号

1.题目描述

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

有效字符串需满足:

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

  • 注:空字符也为有效字符哦(空对空也是一组)
示例:
输入:'()'
输出:ture
输入:'([{}])'
输出:ture
输入:'{}])'
输出:false
输入:'([)]'
输出:false
输入:'([{()})]'
输出:false

2.解题思路

题目意思是给定一串括号的字符,要你判断该字符串中的括号闭合顺序是否一样和顺序是否正确。 我们可以把该字符串拆分成两部分,一部分是左边的括号,一部分是右边的括号。 首先,我们来分析一下特殊情况。 第一,肯定是当这个字符串是空时,应该返回ture 第二,如果该字符串不对称,那肯定返回false 然后,我们会想怎么让字符串中的这些括号进行匹配 那这里就要用到我们的栈了。 栈是一种特殊的字符串,它里面的元素是‘先进后出’。为了方便理解,看下图 在这里插入图片描述

  • 实现过程: 1.初始化一个栈stack, 2.用for循环把字符串遍历出来放入新数组中,并且找出左括号的字符把它放进栈中,此时字符串中只剩下右括号了。 3.我们把栈里的元素取出来去比较右括号,如果没有匹配的就返回false 要注意两种情况:1.当字符串像'{}])' 这时我们会发现当循环一次后,第二次循环栈里已经没有元素了,而右括号还有元素。这时我们应该怎么办?所以判断条件我们应该加上当栈的长度不存在返回false 2.当字符串内的括号完全匹配时,像'([{}])' 当循环结束时,过程3是不会执行的,应该返回ture 所以我们在循环体外返回return !stack.length。!0就相当于1 , ture

3.代码实现

由于个人能力有限,暂时只提供JavaScript语言代码实现。只要理解了本算法的思想,你也能用其他语言实现出来,这也是对个人代码能力的锻炼。

/**
 * @author 我叫坚强我不哭
 * @param {string} s
 * @return {boolean}
 */

const leftToRight = {
    "(":")",
    "{":"}",
    "[":"]"
}

 var isValid = function(s) {
    if (!s) {
        return true
    }
    // 初始化一个stack栈
    const stack = []
    const len = s.length
    for (let i = 0; i < len ;i++) {
      // 遇到左括号就入栈
      // 否则就将栈里的元素取出来比较
      const ch = s[i]
      if (ch == "(" || "{" || "["){
         stack.push(leftToRight[ch])
      }else {
        if (!stack.length || stack.pop() !== ch) {
          return false
        }
      }
    }
    return !stack.length
};

4.总结

一般涉及到对称的话,我们优先考虑用栈来解决。 前期在刷LeetCode时,如果想了一会儿没有思路的话不要死扣,应该果断的去看别人的解题思路。理解了之后,在凭借自己的理解和记忆自己敲一遍。 学习 = 学 + 习。知识是学出来的,不是在自己脑子里蹦出来的;学过之后,还要自己动手练习。新手要勇敢地、经常地学习别人的解法和答案,然后凭理解敲代码练习。只要度过刷题初期的痛苦,后面就会越刷越快。

  • 注:这仅是我自己的理解,如果有更好的方法,欢迎大佬们指点。