可视化图解算法48:有效括号序列

牛客网 面试笔试 TOP101      |       LeetCode 20. 有效的括号

1. 题目

描述

给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

数据范围:字符串长度 0≤n≤10000

要求:空间复杂度 O(n),时间复杂度 O(n)

示例1

输入:

"()[]{}"

返回值:

true

示例2

输入:

"[]"

返回值:

true

示例3

输入:

"([)]"

返回值:

false

2. 解题思路

题目要求,字符串:仅包含:'(',')','{','}','['和']'。因此可以通过栈完成括号的匹配。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3. 编码实现

核心代码如下:

var stack []uint8

// 栈相关操作:
func push(v uint8) {
	stack = append([]uint8{v}, stack...)
}
func pop() {
	stack = stack[1:]
}
func top() uint8 {
	return stack[0]
}
func isEmpty() bool {
	if len(stack) <= 0 {
		return true
	}
	return false
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param s string字符串
 * @return bool布尔型
 */
func isValid(s string) bool {
	// write code here
	//1. 定义一个栈
	stack = make([]uint8, 0)
	for i := 0; i < len(s); i++ {
		//2. 如果是( [ {  ,则将对应的  )  ]  }  入栈
		if s[i] == '(' {
			push(')')
		} else if s[i] == '[' {
			push(']')
		} else if s[i] == '{' {
			push('}')
		} else {
			//3. 字符为右括号,则进行匹配检查
			//3.1 栈为空且字符串没有遍历完,如:))
			if isEmpty() {
				return false
			}
			//3.2 字符串内容与栈顶元素不一致,则不匹配,如:(]
			if s[i] != top() {
				return false
			}
			//3.3 每正确匹配一个,出栈一个元素,进行一下对括号的匹配
			pop()
		}
	}
	if isEmpty() {
		// 4. 所有字符串匹配完,且栈中没有元素,则说明括号匹配
		return true
	}
	//5. 所有字符串匹配完,栈中还有元素,则证明不匹配。如:()[
	return false

}

具体完整代码你可以参考下面视频的详细讲解。

4.小结

括号序列的判断方法为:遍历字符串中的括号字符,如果是左括号则将对应的右括号入栈;如果是右括号则弹出栈顶的元素与字符串内容进行匹配。完全匹配的条件是:字符串中的内容取完且栈中没有元素。


《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

  ✅   链表

  ✅   二叉树

  ✅   二分查找、排序

  ✅   堆、栈、队列

  ✅   回溯算法

  ✅   哈希算法

  ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:人面不知何处去,桃花依旧笑春风。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值