From 9319ce9cdcab03027644ce1cff57b4060d53bc99 Mon Sep 17 00:00:00 2001 From: cherrypicker Date: Sat, 23 Dec 2023 08:34:38 +0800 Subject: [PATCH] =?UTF-8?q?Update0020.=E6=9C=89=E6=95=88=E7=9A=84=E6=8B=AC?= =?UTF-8?q?=E5=8F=B7=20Go=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原有的实现已经足够简洁清晰,这个版本的代码增加了注释,提升了可读性。 --- problems/0020.有效的括号.md | 48 ++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md index 045c79ee..17fbe2be 100644 --- a/problems/0020.有效的括号.md +++ b/problems/0020.有效的括号.md @@ -218,23 +218,41 @@ class Solution: ### Go: ```Go +// 思路: 使用栈来进行括号的匹配 +// 时间复杂度 O(n) +// 空间复杂度 O(n) func isValid(s string) bool { - hash := map[byte]byte{')':'(', ']':'[', '}':'{'} - stack := make([]byte, 0) - if s == "" { - return true - } + // 使用切片模拟栈的行为 + stack := make([]rune, 0) - for i := 0; i < len(s); i++ { - if s[i] == '(' || s[i] == '[' || s[i] == '{' { - stack = append(stack, s[i]) - } else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] { - stack = stack[:len(stack)-1] - } else { - return false - } - } - return len(stack) == 0 + // m 用于记录某个右括号对应的左括号 + m := make(map[rune]rune) + m[')'] = '(' + m[']'] = '[' + m['}'] = '{' + + // 遍历字符串中的 rune + for _, c := range s { + // 左括号直接入栈 + if c == '(' || c == '[' || c == '{' { + stack = append(stack, c) + } else { + // 如果是右括号,先判断栈内是否还有元素 + if len(stack) == 0 { + return false + } + // 再判断栈顶元素是否能够匹配 + peek := stack[len(stack)-1] + if peek != m[c] { + return false + } + // 模拟栈顶弹出 + stack = stack[:len(stack)-1] + } + } + + // 若栈中不再包含元素,则能完全匹配 + return len(stack) == 0 } ```