题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
限制:
1 <= s.length <= Math.pow(10, 4)
s 仅由括号 '()[]{}' 组成
大致思路:
先判断出不符合条件的几种情况:
- 长度为奇数, 分为一下两种情况:
- 左边的括号多一个
expect(isValid('(){}[')).toBe(false); - 右边的括号多一个
expect(isValid('(){}[]]')).toBe(false);
- 符号对应不上
expect(isValid('(}')).toBe(false);
function isValid(s: string): boolean {
//添加限制
if (s.length < 1 || s.length > Math.pow(10, 4) || !(/^[\{\}\(\)\[\]]+$/.test(s))) return false;
//奇数直接false
if (s.length % 2) return false;
//建立数组, 用来比较
const st: string[] = [];
//建立对应关系字典
const map: { [key: string]: string } = Object.create(null);
map['('] = ')';
map['{'] = '}';
map['['] = ']';
//遍历字符串
for (let i = 0; i < s.length; ++i) {
// 如果当前为左括号 将左括号对应的右括号push进数组
if (map[s[i]]) st.push(map[s[i]]);
/**
* 当前分支为s[i]为 右括号 值
* pop:弹出数组最后push进去的元素(栈 后进先出原则)
* 利用数组pop函数的返回值(移出的元素), 用来和s[i]对比,
* 如果符合对称关系, 则其应该相等, 如若有不相等, 则返回false
*/
else if (s[i] !== st.pop()) {
return false;
}
}
//若成功pop完数组, 并且数组内容为空, 则符合条件
return !st.length;
}