leetcode20-有效括号

举报
林太白 发表于 2025/11/10 13:41:30 2025/11/10
【摘要】 leetcode20-有效括号

leetcode20-有效括号

题目

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

有效字符串需满足:

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

输入示例以及提示

示例 1:

**输入:**s = “()”

**输出:**true

示例 2:

**输入:**s = “()[]{}”

**输出:**true

示例 3:

**输入:**s = “(]”

**输出:**false

示例 4:

**输入:**s = “([])”

**输出:**true

示例 5:

**输入:**s = “([)]”

**输出:**false

提示:

  • 1 <= s.length <= 10<sup>4</sup>
  • s 仅由括号 '()[]{}' 组成

思考

方案一(错误)

我们首先的想法是拿出来 所有的左括号,再拿出所有的右括号 ,放入对应的数组,如果左侧括号和右侧括号两个数组的长度相等,则括号对应

let s= '([)]';//"()[]{}";
		console.log(s,'s');
		function isvalidkuohao(str){
			let arrA=[],arrB=[];
			for (let  i = 0; i < str.length; i++) {
				console.log(str[i],'iiii');
				if(str[i]=='('||str[i]=='{'||str[i]=='['){
					arrA.push(str[i])	
				}else if(str[i]==')'||str[i]=='}'||str[i]==']'){
					arrB.push(str[i])
				}else{}
			}
			if(arrA.length==arrB.length){
				console.log('true');
				return true;
			}else{
				console.log('false');
				return false;
			}
		}
isvalidkuohao(s);

但是很明显我们这种参数的结果是错误的'([)]',所以我们调整,应该对应我们下边

比如:左侧最后一个对应右侧第一个是正确的闭合

方案二 (ok)

换个思考,其实就是我们从左侧拿出来的和右边的形成对称

也就是左边最后一个应该是右边第一个 对比有效闭合的

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (str) {
    const stack = [];
    for (let i = 0; i < str.length; i++) {
        const char = str[i];
        if (char === '(' || char === '{' || char === '[') {
            // 如果是左括号,压入栈中
            stack.push(char);
        } else {
            // 如果是右括号
            if (stack.length === 0) {
                console.log('false');
                return false;
            }
            const top = stack.pop();
            console.log(top, 'stack.pop()');
            if (top === '(' && char !== ')') {
                console.log('false');
                return false;
            }
            if (top === '{' && char !== '}') {
                console.log('false');
                return false;
            }
            if (top === '[' && char !== ']') {
                console.log('false');
                return false;
            }
        }
    }
    console.log(true);
    return stack.length === 0;
};

测试一下,我们写法ok

优化方案二

优化,我们可以使用in操作符对于表达式优化写法

// 解法二 优化写法
function isValid(str) {
    const stack = [];
    const bracketMap = {
        '(': ')',
        '{': '}',
        '[': ']'
    };
    for (let i = 0; i < str.length; i++) {
        const char = str[i];
        if (char in bracketMap) {
          console.log(char,'char--')
            // 如果是左括号,压入栈中
            stack.push(char);
        } else {
            // 如果是右括号
            if (stack.length === 0 || bracketMap[stack.pop()] !== char) {
                console.log('false');
                return false;
            }
        }
    }
    console.log(true);
    return stack.length === 0;
}
isValid(s);

优化为右括号压栈

上面我们的写法都是压入左括号然后进行入栈,我们可以直接入栈右括号,判断的时候就非常方便

也就相当于我们直接拿} 对比 }

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (str) {
    const stack = [];
    const bracketMap = {
        '(': ')',
        '{': '}',
        '[': ']'
    };
    for (let i = 0; i < str.length; i++) {
        const char = str[i];
        if (char in bracketMap) {
            stack.push(bracketMap[char]); // 直接压入对应的右括号
        } else if (stack.length === 0 || stack.pop() !== char) {
            return false;
        }
    }
    return stack.length === 0;
}

测试一下,ok

优化写法

最后优化一下我们的写法

 // 解法三 优化右符号压栈
    function isValid(str) {
        const stack = [];
        const mapData = {
            "{": "}",
            "(": ")",
            "[": "]",
        };
        for (const char of str) {
            if (char in mapData) {
                stack.push(mapData[char]);
            } else if (stack.length === 0 || stack.pop() !== char) {
                return false
            };
        }
        return stack.length === 0
    }

测试

 // 测试示例
    const testCases = [
        "()",
        "()[]{}",
        "(]",
        "([)]",
        "{[]}"
    ];

    testCases.forEach(s => {
        console.log(`"${s}": ${isValid(s)}`);
    });

测试OK

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。