给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
解题思路:
1.借助哈希存储匹配括号,右括号做key,左括号做value
2.通过栈匹配,左括号压栈,遍历匹配到右括号弹栈,若匹配失败即为左括号,考虑压栈,若遇到右括号且匹配左括号没入栈直接返回False
边界:
1.空串,直接返回False
2.第一个字符不在哈希表中,可能是右括号或非括号,如"}}]()"、"hello",直接返回False
3.长度为1,直接返回False, 如"["
效率:
- 时间复杂度:遍历一遍字符串,O(n)
- 空间复杂度:借助哈希表存储括号,常数级,另外开辟容器存放左括号,最坏时全部都是左括号,如["(","{","["],此时可能是O(n)
python
def is_valid_parenetheses(strs: str) -> bool:
"""
:param strs: str
:return: bool
"""
# 定义辅助哈希表
map_p = {
"}": "{",
"]": "[",
")": "("
}
stack = []
# 1.空串,2.第一个元素是右括号,3.长度小于2,如"{"、"}"
if not strs or strs[0] in map_p.keys() or len(strs) < 2:
return False
for str in strs:
if stack and str in map_p: # 栈非空时且当前括号在哈希表的键中,不满足下列则压栈,即左括号都压栈
if stack[-1] == map_p[str]: # 栈顶元素与哈希表键匹配时,弹栈,否则返回False
stack.pop()
else:
return False
else:
stack.append(str)
return not stack # 栈空即全部匹配,True, 否则False
if __name__ == "__main__":
str1 = ""
str2 = " "
str3 = "["
str4 = "]"
str5 = "{}{}{}()"
str6 = "{[()()]}"
str7 = "{[((()]}"
str8 = "{[()()]}(("
print(is_valid_parenetheses(str1)) # False
print(is_valid_parenetheses(str2)) # False
print(is_valid_parenetheses(str3)) # False
print(is_valid_parenetheses(str4)) # False
print(is_valid_parenetheses(str5)) # True
print(is_valid_parenetheses(str6)) # True
print(is_valid_parenetheses(str7)) # False
print(is_valid_parenetheses(str8)) # False