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

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

一、题目

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

输入:s = "(]" 输出:false 示例 4:

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

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

二、思路

  • 用一个数组模拟栈,遍历字符串,把左括号作为key存在栈中,遇到右括号去栈中找,找到一对key和value配对的就把栈中最后一个数pop出来,最后栈中空了,就是有效字符串
  • 可以用数组和map方法解决

三、解法

3.1 解法一 遍历字符串,用数组的方式和模拟栈的方式解题

var isValid = function (s) {
    if (!s || s.length % 2 !== 0) return false

    let stackArr = []
    let keyArr = ['(', '{', '[']
    let valueArr = [')', '}', ']']

    for (let i = 0; i < s.length; i++) {
        if (stackArr.length === 0) {
            stackArr.push(s[i])
        } else {
            let lastAlpha = stackArr[stackArr.length - 1]      
            let index = valueArr.findIndex(v => v === s[i])
            if (index === -1) {
                stackArr.push(s[i])
            } else {
                if (lastAlpha === keyArr[index]) {
                    stackArr.pop()
                } else {
                    stackArr.push(s[i])
                }
            }
        }
    }

    return stackArr.length === 0
};
复制代码

3.2 解法二,用map代码更少,更简洁

var isValid2 = function (s) {
    if (!s || s.length % 2 !== 0) return false

    let stackArr = []
    let map = new Map([['(',')'],['{','}'],['[',']']])

    for (const ch of s) {
        if(map.has(ch)) {
            stackArr.push(ch)
        } else {
            if(map.get(stackArr[stackArr.length -1]) !== ch || stackArr.length === 0) {
                return false
            } else {
                stackArr.pop()
            }
        }
    }

    return stackArr.length === 0
};
复制代码

四、提交结果

  • 注意第一次没通过,要注意这种情况,"(){}}{"

image.png

分类:
前端
分类:
前端
收藏成功!
已添加到「」, 点击更改