題目
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
分析
這題比較簡單,使用棧的LIFO的特性,如果是左邊的括號就進棧,如果是右邊的括號,就與棧頂元素比較,是他的另外一邊,就彈棧。繼續前進,利用了括號成對的特性,即最內層的左括號,下一個括號必然是他的右括號,否則就有問題。
解法
func isValid(s string) bool {
var stack []byte
for _, c := range []byte(s) {
if c == '{' || c == '[' || c == '(' {
stack = append(stack, c)
} else if c == '}' {
if !isLeft(stack, '{') {
return false
}
stack = stack[:len(stack)-1]
} else if c == ']' {
if !isLeft(stack, '[') {
return false
}
stack = stack[:len(stack)-1]
} else if c == ')' {
if !isLeft(stack, '(') {
return false
}
stack = stack[:len(stack)-1]
}
}
if len(stack) > 0 {
return false
}
return true
}
func isLeft(stack []byte, target byte) bool {
if len(stack) > 0 && stack[len(stack)-1] == target {
return true
} else {
return false
}
}