题目来源
题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
提示
1 <= s.length <= 10^4
s
仅由括号'()[]{}'
组成
题目解析
本题可以利用 “栈” 解题。
我们可以定义一个栈 stack,然后遍历字符串 s 的每一个字符 c:
- 若 stack 为空栈 或 stack.top 栈顶元素 和 c 无法配对,则 c 压入 stack 中
- 若 stack 不为空栈 且 stack.top 栈顶元素 和 c 形成配对,则 c 无须压入 stack 且 stack.top 栈顶元素需要被弹栈。
最终,当 s 串遍历完所有字符后,stack 为空,则说明所有括号都完成了配对。
以示例4为例:
C源码实现
bool isValid(char* s) {
int dic[128] = {0};
dic[')'] = '(';
dic['}'] = '{';
dic[']'] = '[';
int len = strlen(s);
char stack[len];
int stack_size = 0;
for (int i = 0; i < len; i++) {
if (stack_size == 0 || stack[stack_size - 1] != dic[s[i]]) {
stack[stack_size++] = s[i];
} else {
stack_size--;
}
}
return stack_size == 0;
}
C++源码实现
class Solution {
public:
bool isValid(string s) {
map<char, char> dic;
dic[')'] = '(';
dic['}'] = '{';
dic[']'] = '[';
stack<char> stk;
for (char c: s) {
if (stk.empty() || stk.top() != dic[c]) {
stk.push(c);
} else {
stk.pop();
}
}
return stk.empty();
}
};
Java源码实现
class Solution {
public boolean isValid(String s) {
int[] dic = new int[128];
dic[')'] = '(';
dic['}'] = '{';
dic[']'] = '[';
ArrayDeque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (stack.isEmpty() || stack.getLast() != dic[c]) {
stack.addLast(c);
} else {
stack.removeLast();
}
}
return stack.isEmpty();
}
}
Python源码实现
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
dic = {
')': '(',
']': '[',
'}': '{'
}
stack = []
for c in s:
if stack and c in dic and stack[-1] == dic[c]:
stack.pop()
else:
stack.append(c)
return len(stack) == 0
JavaScript源码实现
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
const dic = {
')': '(',
'}': '{',
']': '['
};
const stack = [];
for (let c of s) {
if (stack.length == 0 || stack.at(-1) != dic[c]) {
stack.push(c);
} else {
stack.pop();
}
}
return stack.length == 0;
};