一、题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
二、思路分析
有题目可知,只有三种类型的字符串:()、{}、[],并且可以知道本题使用 栈 来进行解决,因为符合后出现的字符括号需先匹配的原则,即后进先出,是栈的特性。
所以本题的一个解决思路:
1、字符串的长度一定为偶数,为奇数则一定不能完全匹配完,即奇数长度一定为 false;
2、将所有的左括号存入栈中,当遇到右括号时,将右括号和栈顶元素进行匹配,如果不是一对有效括号,则直接返回 false;
三、代码参考
1、Java
class Solution {
public boolean isValid(String s) {
// 单数长度的字符串一定为 false
if(s.length() % 2 == 1){
return false;
}
// 创建一个栈空间来装字符串中的左符号
Stack<Character> stack = new Stack<>();
// 循环遍历数组
for(int i = 0; i < s.length(); i++){
// 获取当前索引值为 i 的字符元素
char str = s.charAt(i);
// 判断字符是否为左括号,如果是则入栈
if(str == '('){
stack.push('(');
}else if(str == '{'){
stack.push('{');
}else if(str == '['){
stack.push('[');
}
// 如果不是左括号,则与栈顶元素进行比较,看是否为一对符号
else{
// 先判断栈是否为空,如果已经为空,则直接返回 false
if(stack.isEmpty()){
return false;
}
// 不为空,则取栈顶元素进行比较
// 获取栈顶元素
char stackTop = stack.peek();
// 进行比较
if(stackTop == '(' && str == ')' || stackTop == '{' && str == '}' || stackTop == '[' && str == ']'){
// 匹配成功,移除栈顶元素
stack.pop();
}else{
// 匹配失败则返回 false
return false;
}
}
}
// 循环结束,判断栈空间是否为空,如果为空,则全部匹配成功,返回 true,不为空,则为 false
return stack.isEmpty();
}
}
2、Python
class Solution(object):
def isValid(self, s):
# 单数长度的字符串一定为 False
if len(s) % 2 == 1:
return False
# 创建一个栈空间来装字符串中的左符号
stack = list()
# 循环遍历数组
for str in s:
# 判断字符是否为左括号,如果是则入栈
if str == '(':
stack.append('(')
elif str == '{':
stack.append('{')
elif str == '[':
stack.append('[')
# 如果不是左括号,则与栈顶元素进行比较,看是否为一对符号
else:
# 先判断栈是否为空,如果已经为空,则直接返回 false
if not stack:
return False
# 不为空,则取栈顶元素进行比较
# 获取栈顶元素
stackTop = stack[-1]
# 进行比较
if stackTop == '(' and str == ')' or stackTop == '{' and str == '}' or stackTop == '[' and str == ']':
# 匹配成功,移除栈顶元素
stack.pop()
else:
# 匹配失败则返回 False
return False
# 循环结束,判断栈空间是否为空,如果为空,则全部匹配成功,返回 True,不为空,则为 False
return not stack