算法系列-第五题

56 阅读1分钟

题目名称:有效括号序列

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:


输入: s = "()"

输出: true

示例  2:


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

输出: true

示例  3:


输入: s = "(]"

输出: false


/**

* 解法一:栈

* 思路:

*(1)左括号,压栈

*(2)右括号,则判断栈顶是否匹配(是否出栈)否则直接 return false

* (3) 最后 return stack.length === 0

* 时间复杂度:O(n),其中 n 为字符串长度

* 空间复杂度:O(n),最坏情况下栈空间记录整个字符串长度的右括号

*/

function isMatch(left, right) {

if (

(left === "{" && right === "}") ||

(left === "[" && right === "]") ||

(left === "(" && right === ")")

)

return true;

  


return false;

}

  


function isValid(s) {

const len = s.length;

if (len === 0) return true;

  


const stack = [];

const leftSymbols = "{[(";

const rightSymbols = ")]}";

  


for (let i = 0; i < len; i++) {

const char = s[i];

  


if (leftSymbols.includes(char)) {

// 左括号,压栈

stack.push(char);

} else if (rightSymbols.includes(char)) {

// 右括号,判断栈顶(是否出栈)

const top = stack[stack.length - 1];

  


if (isMatch(top, char)) {

stack.pop();

} else {

return false;

}

}

}

  


return stack.length === 0;

}