分享
  1. 首页
  2. 文章

Leetcode 题目:括号匹配

Donne · · 2191 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

这道题目是 LeetCode 第 20 题 Valid Parentheses

在我用 Go 解答这个问题时,发现了 Go 特别的用法和一些求解中容易忽略的边界条件,觉的还是有必要记录一下。

题目简述

给定一个只包含 '(',')','{','}','['']'的字符串,判断字符串是否有效。有效的条件为:括号必须有相同的括号对应, 且括号必须以正确的顺序对应。

示例1:

输入:"()"
输出:true

示例2:

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

示例3:

输入:"([)]"
输出:true

解题思路

遍历字符串每个字符,当字符属于'(','{','['时,将字符压入栈。若字符不属于,则将当前字符与栈顶元素比较,如果括号对应说明正确并弹出栈顶元素,否则返回错误。

依照此思路写下第一个版本的答案:

func isValid(s string) bool {
 brackets := map[rune]rune{')': '(', ']': '[', '}': '{'}
 var stack []rune
 for _, char := range s {
 if char == '(' || char == '{' || char == '[' {
 stack = append(stack, char)
 } else if brackets[char] == stack[len(stack) - 1] {
 stack = stack[:len(stack) - 1]
 } else {
 return false
 }
 }
 return false
}

Go 一般是不会出现单引号的,单引号只能包含一个字符,通过 fmt.Println(reflect.TypeOf('(')) 可以发现它是一个 int32 类型,也就等同于 rune 类型,关于 rune 的解释,可以查看这个博客。字符串底层是 byte,中文在 utf-8 编码下是 3 byte,而是用 unicode 解码就是 1 个字符。

以上代码并不能通过 leetcode 的测试,因为这里忽略了两个测试情况:

  • 匹配过程中栈为空。例如{}}
  • 匹配结束,stack 还不为空。例如{{}

然后我们修复这个问题:

func isValid(s string) bool {
 brackets := map[rune]rune{')': '(', ']': '[', '}': '{'}
 var stack []rune
 for _, char := range s {
 fmt.Println(reflect.TypeOf(char))
 if char == '(' || char == '{' || char == '[' {
 // 入栈
 stack = append(stack, char)
 // 循环中,stack不能为空
 } else if len(stack) > 0 && brackets[char] == stack[len(stack) - 1] {
 // 栈中有数据,且此元素与栈尾元素相同
 stack = stack[:len(stack) - 1]
 } else {
 return false
 }
 }
 // 循环结束,栈中还有数据则 false
 return len(stack) == 0
}

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:Donne

查看原文:Leetcode 题目:括号匹配

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2191 次点击
1 回复 | 直到 2018年10月25日 17:02:10
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏