1.题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
2.示例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
3.思路
首先需要找规律,第一如果该字符串个数为奇数那么绝对是无效的。并且需要用栈进行判断当遇到右括号时候,则与栈顶中元素进行对比,如果是匹配的左括号则出栈。如果出现不匹配则
4.代码
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
// 如果个数是奇数则绝对有问题
if (s.length()%2==1){
return false;
}
Map<Character,Character> map = new HashMap<>();
map.put('}','{');
map.put(')','(');
map.put(']','[');
// 右括号无法存放进入stack中
for (int i=0;i<s.length();i++){
if (s.charAt(i)=='('||s.charAt(i)=='['||s.charAt(i)=='{'){
stack.push(s.charAt(i));
}else {
// 解决第一个右括号问题
if(stack.isEmpty()){
return false;
}
if (stack.peek() == map.get(s.charAt(i))){
stack.pop();
}else {
return false;
}
}
}
if (!stack.isEmpty()){
return false;
}
return true;
}
}
时间复杂度O(n),空间复杂度O(1)