题目:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例
示例序号 | 输入 | 输出结果 |
---|---|---|
1 | s = “()” | true |
1 | s = “()[]{}” | true |
1 | s = “(]” | false |
1 | s = “([)]” | false |
1 | s = “{[]}” | true |
正解代码
// Java
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>(); //定义并初始化一个栈/队列
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {
//stack.peek()为读取栈顶值
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop(); //删除栈顶
} else {
stack.push(ch); //插入栈顶
}
}
return stack.isEmpty();
}
}
// C++
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;
for (char ch: s) {
if (pairs.count(ch)) {
if (stk.empty() || stk.top() != pairs[ch]) {
return false;
}
stk.pop();
}
else {
stk.push(ch);
}
}
return stk.empty();
}
};
题目来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses