Given a string s
containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
An input string is valid if:
Example 1:
Input: s = "()"
Output: true
Example 2:
Input: s = "()[]{}"
Output: true
Example 3:
Input: s = "(]"
Output: false
Constraints:
1 <= s.length <= 10^4
s
consists of parentheses only '()[]{}'
.給定一個字串 s, 這個字串只會由 '(', ')', '[', ']','{','}' 六種字元所組成
定義字串 s 是 valid 如果符合以下條件:
1 對於每個 '(', '[', '{' 三種字元,找得到在其右方找到對應的 ')',']','}' 來做配對
2 每個 ')',']','}' 三種字元, 找在其左方找到對應的 '(', '[', '{' 來做配對
3 每個字元只能用來做一次配對
4 每個配對位置順需必須正確
在這種情況下假設字串 s 是合法的, 可以發現對於每種字元做計數
可以發現每個位置 的 '(', '[', '{' 個數一定要大於等於 ')',']','}'
因為要能配對成功 ')',']','}' 必須在左方找到 ')',']','}'
且因為配對順序必須正確代表 後出現的字元必須要先配對
所以可以採用 stack 來蒐集 '(', '[', '{', 當遇到 ')',']','}' 就 pop 出 stack 最上方字元做比對
如果發現 stack 最上方字元 比對不到正確的配對 則返回false
如果到最後都比對正確代表符合 valid 且 stack is empty 則代表可以完全 match 返回 true
作法如下圖
透過 Stack 這種資料結構,只需要走訪過一次所有字元
就可以判斷完成。
時間複雜度是 O(n)。
空間複雜度是 O(n)。
因為需要存儲每個走過 '{','(','[' 字元,其數量為 n/2 where n = len(s)
package sol
func isValid(s string) bool {
if len(s) <= 1 {
return false
}
stack := []rune{}
popMap := map[rune]rune{')': '(', ']': '[', '}': '{'}
for _, val := range s {
if popVal, exist := popMap[val]; !exist {
stack = append(stack, val)
} else {
if len(stack) == 0 {
return false
}
topVal := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if topVal != popVal {
return false
}
}
}
return len(stack) == 0
}