算法之“栈”的妙用---》括号匹配问题

373 阅读1分钟

题目: 有效的括号

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  1. '({})[]({[]}){()}' true
  2. '([)]{}' false
  3. '()[]{}' true
题目分析:栈的先入后出原理与括号的排序特点一致,先入栈的左括号一定后匹配到与之对应的右括号。
1. 遍历括号字符串
2. 如果遇到左括号则入栈。
3. 如果遇到右括号:
3.1 如果此时栈是空的,说明左边没有与之相配的左括号则是无效的括号。
3.2 如果栈不为空,则栈顶元素出栈,与当前元素看是否匹配,不匹配则是无效的括号
   匹配继续遍历下个括号。
function isValid(s) {
	const map = {
		'{': '}',
		'[': ']',
		'(': ')',
	}
	const length = s.length;
	const stack = [];
	for(let i = 0; i < length; i++) {
		switch(s[i]) {
			case '{':
			case '[':
			case '(': {
				stack.push(s[i]);
				break;
			}
			case '}':
			case ']':
			case ')': {
				if(stack.length === 0) {
					return false;
				}
				const stackTop = stack.pop();
				if(map[stackTop] !== s[i]) {
					return false;
				}

			}
		}	
	}

	if(stack.length === 0) {
		return true;
	} else {
		return false;
	}
}