高频算法面试题(十六)- 有效的括号

423 阅读2分钟

「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战

刷算法题,从来不是为了记题,而是练习把实际的问题抽象成具体的数据结构或算法模型,然后利用对应的数据结构或算法模型来进行解题。个人觉得,带着这种思维刷题,不仅能解决面试问题,也能更多的学会在日常工作中思考,如何将实际的场景抽象成相应的算法模型,从而提高代码的质量和性能

有效的括号

题目来源LeetCode-20. 有效的括号

题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合
  2. 左括号必须以正确的顺序闭合

示例

示例 1

输入:s = "()"
输出:true

示例 2

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

示例 3

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

解题

思路

这个可以用栈这种数据结构来解决。当遇到左括号,就将其压入到栈中,遇到右括号,则弹出栈顶元素与该右括号匹配,如果不能匹配,则不满足要求,如果匹配则继续遍历,直到遍历完字符串,且栈为空

不难想到第一个字符不应该是右括号,如果是右括号,肯定是不满足条件的。可以维护一个map,存储匹配的括号,key为右括号,value为左括号

  • 如果遇到右括号,则取出栈顶元素进行比较
  • 如果遇到左括号则压入栈中

代码

func IsValid(s string) bool {
	n := len(s)
	if n % 2 != 0 {
		return false
	}
	mapBrackets := map[byte]byte{
		')':'(',
		']':'[',
		'}':'{',
	}
	stack := []byte{}
	for i:=0; i < n; i++ {
		if _, ok := mapBrackets[s[i]]; ok {
			if len(stack) == 0 || stack[len(stack)-1] != mapBrackets[s[i]] {
				return false
			}
			stack = stack[:len(stack)-1]
		} else {
			stack = append(stack, s[i])
		}
	}

	if len(stack) == 0 {
		return true
	}

	return false
}