Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 10 的 4次方
s 仅由括号 '()[]{}' 组成
思路分析:
有两种思路。
- 一个是使用栈,遇到左边括号入栈,遇到对应的右边括号出栈,最后判断栈是否为空。
该方法用上了数据结构,是相对高大上的方案。 - 因为字符串的值仅由括号 '()[]{}' 组成,所以也可以使用字符串替换。
将字符串中所有的()[]{}无限循环替换,当替换前和替换后的长度不变时结束循环。
然后判断最后的字符串是否为空,为空则有效,不为空则无效。
AC 代码:
golang :
// 有效的括号
func isValid(s string) bool {
tmp := s
// 无限循环
for {
// 替换前长度
ln := len(tmp)
// 对三种括号进行替换
tmp = strings.ReplaceAll(tmp, "()", "")
tmp = strings.ReplaceAll(tmp, "[]", "")
tmp = strings.ReplaceAll(tmp, "{}", "")
// 替换前后长度相同时,跳出循环
if ln == len(tmp) {
break
}
}
// 替换后结果为空字符串,则返回 true ,否则返回 false 。
if tmp == "" {
return true
}
return false
}
总结:
字符串替换也仅适用于题目给出的条件。
如果字符串包含括号之外的字符,需要判断括号是否正确配对的话,只能使用第一种方案,然后忽略非括号就可以了。
不知道用正则表达式能不能实现,有时间再研究研究。