1、问题
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
2、示例
(1)
输入:s = "()"
输出:true
(2)
输入:s = "()[]{}"
输出:true
(3)
输入:s = "(]"
输出:false
3、思路
先判断是否括号数是不是偶数,然后通过循环遍历字符串中的每一项,通过switch匹对符号,是左括号都压入栈,是右括号通过匹配判断弹出的是否和遍历到的右括号匹配,不匹配返回false
4、步骤
(1)判断括号数
(2)设置空栈(空数组)
(3)循环遍历字符串中的各项
1)循环内通过switch-case匹配判断,左括号都压入栈,是右括号通过匹配判断弹出的是否和遍历到的右括号匹配,不匹配返回false
(4)返回栈长,若为空说明匹配完闭
5、完整代码(这里有两个方法isValid是官方的方法,法二是这里讲述的方法)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>有效的括号</title>
</head>
<body><p>给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。<p>有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。</p></p><p>输入:s = "()"输出:true</p><p>输入:s = "()[]{}"输出:true</p><p>输入:s = "(]"输出:false</p><p>(不行)将字符串切割成数组,然后将数组的半数长度存入变量作为终止条件,然后外层循环从前往后变量,内层循环从后向前遍历以空间遇到和上一个不同的存入不同的数组,需要三个数组</p>
</body>
<script>// let str = "()"let str ='(]'isValid(str)isValid1(str)function isValid(s) {const n = s.length;// 括号数是奇数,不符合,直接返回falseif (n % 2 === 1) {return false;}// 创建右括号到左括号的映射,方便找到左括号const pairs = new Map([[')', '('],[']', '['],['}', '{']]);// console.log(pairs);// 建立空栈,方便存储和弹出const stk = [];// 遍历字符串的每一项for (let ch of s) {// console.log(ch);// 如果字符中有map中的一个右括号(可以是)或]或}),查看是否有相应的左括号进行匹配if (pairs.has(ch)) {// 如果栈为空或者栈中无左括号可以与之匹配,返回falseif (!stk.length || stk[stk.length - 1] !== pairs.get(ch)) {return false;}// 可以匹配弹出左括号stk.pop();}else {// 左括号压入栈stk.push(ch);}};// 遍历完后空栈为true,否则false// console.log(!stk.length,1111);return !stk.length;}function isValid1(s){let n = s.length// 括号数是奇数,不符合,直接返回falseif (n % 2 === 1) {return false;}// 先用循环,然后在循环中使用switch、case判断括号是否符合,左括号压入栈、右括号弹出// 空栈存储let stk = []for (let i of s) {// console.log(i); switch (i) {case '(':case '[':case '{':stk.push(i)break; case ')':// stk.pop返回值是弹出的那一项(pop从数组最后开始弹出)// console.log(stk.pop());if (stk.pop()!=='(') return falsebreak;case ']':if (stk.pop()!=='[') return falsebreak;case '}':if (stk.pop()!=='{') return falsebreak; }}// console.log(!stk.length);// 遍历完后空栈为true,否则false// console.log(!stk.length,1111);return !stk.length}
</script>
</html>
6、力扣通过代码
var isValid = function(s) {let n = s.length// 括号数是奇数,不符合,直接返回falseif (n % 2 === 1) {return false;}// 先用循环,然后在循环中使用switch、case判断括号是否符合,左括号压入栈、右括号弹出// 空栈存储let stk = []for (let i of s) {// console.log(i); switch (i) {case '(':case '[':case '{':stk.push(i)break; case ')':// stk.pop返回值是弹出的那一项(pop从数组最后开始弹出)// console.log(stk.pop());if (stk.pop()!=='(') return falsebreak;case ']':if (stk.pop()!=='[') return falsebreak;case '}':if (stk.pop()!=='{') return falsebreak; }}// console.log(!stk.length);// 遍历完后空栈为true,否则false// console.log(!stk.length,1111);return !stk.length
};