# 引言
题目链接:https://leetcode.com/problems/valid-parentheses/description/
# 题目大意
输入一个由各种括号组成的字符串,按照如下规则判断字符串是否有效
条件:
- 开括号必须由相同类型的括号来关闭,即 '(' 由 ')' 关闭、'[' 由 ']' 关闭,'{' 由 '}' 关闭.
- 按照正确的顺序打开的括号必须按照同样顺序关闭。
Hont: Note that an empty string is also considered valid.
- Example
Input: "()"
Output: true
Input: "()[]{}"
Output: true
Input: "(]"
Output: false
Input: "([)]"
Output: false
Input: "{[]}"
Output: true
# 题解
# 一句话题解
括号匹配的规则符合后进先出的原则,直接使用 stack 模拟流程即可。每次选取栈顶和当前输入比较,看是否匹配;匹配则栈顶元素出栈,否则当前元素入栈,当输入串遍历完毕后判断栈是否为空即可
# 复杂度
时间复杂度 O(n)
空间复杂度 O(n)
# AC 代码
c++
版本
class Solution | |
{ | |
public: | |
bool isValid(string s) | |
{ | |
stack<char> match; | |
for (const char c : s) | |
{ | |
if (isMatch(match.empty() ? '\0' : match.top(), c)) | |
{ | |
match.pop(); | |
} | |
else | |
{ | |
match.push(c); | |
} | |
} | |
return match.empty(); | |
} | |
private: | |
bool isMatch(const char a, const char b) | |
{ | |
if ((a == '(' && b == ')') || | |
(a == '[' && b == ']') || (a == '{' && b == '}')) | |
{ | |
return true; | |
} | |
return false; | |
} | |
}; |
go
版本
func isMatch(a, b byte) bool { | |
if (a == '(' && b == ')') || | |
(a == '[' && b == ']') || (a == '{' && b == '}') { | |
return true | |
} | |
return false | |
} | |
func isValid(s string) bool { | |
var match []byte | |
for _, c := range s { | |
lens := len(match) | |
if 0 == lens || !isMatch(match[lens-1], byte(c)) { | |
match = append(match, byte(c)) | |
} else { | |
match = match[0 : lens-1] | |
} | |
} | |
return 0 == len(match) | |
} |