题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()” 输出:true
示例 2:
输入:s = “()[]{}” 输出:true
示例 3:
输入:s = “(]” 输出:false
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/valid-parentheses 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 func isValid (s string ) bool { if len (s) % 2 == 1 { return false } str := []byte {} flag := true for i:=0 ;i<len (s) && flag;i++{ switch s[i]{ case '(' ,'{' ,'[' : str = append (str,s[i]) case ')' : if len (str) == 0 { flag = false break } if str[len (str)-1 ] == '(' { str = str[:len (str)-1 ] }else { flag = false } case '}' : if len (str) == 0 { flag = false break } if str[len (str)-1 ] == '{' { str = str[:len (str)-1 ] }else { flag = false } case ']' : if len (str) == 0 { flag = false break } if str[len (str)-1 ] == '[' { str = str[:len (str)-1 ] }else { flag = false } default : break } } if len (str) != 0 { flag = false } return flag }
解题思路 栈是一个后进先出的队列,用在这里可以避免复杂的判断结构。但是,Go语言的标准库没有栈这种结构,我就手动实现了一个。
题解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 func isValid (s string ) bool { size := len (s) stack := make ([]byte , size) top := 0 for i := 0 ; i < size; i++ { c := s[i] switch c { case '(' : stack[top] = c + 1 top++ case '[' , '{' : stack[top] = c + 2 top++ case ')' , ']' , '}' : if top > 0 && stack[top-1 ] == c { top-- } else { return false } } } return top == 0 }
根据 benchmark显示,极端情况下,可以减少 40% 的时间。
总结