这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
- 示例 1:
输入:s = "()" 输出:true
- 示例 2:
输入:s = "()[]{}" 输出:true
- 示例 3:
输入:s = "(]" 输出:false
- 示例 4:
输入:s = "([)]" 输出:false
- 示例 5:
输入:s = "{[]}" 输出:true
提示:
1 <= s.length <= 10^4
s 仅由括号 '()[]{}' 组成
思路:
使用栈stack的方式
-
排除边界值: 若字符串为空则字符串无效 由于字符串s仅由括号 '()[]{}' 组成,若字符串的长度非偶数,那么肯定存在未配对的括号,则字符串无效
-
创建一个HashMap pairs
key值为3种右括号,value值为对应的左括号,用来判断括号是否为相对应,key值选右括号是为了在遍历的时候出现右括号的情况,能够快速知道右括号所对应的左括号是什么
- 遍历字符串s:
-
首先取出来的元素必定是左括号('(','[','{'),然后将元素进栈,一直到取出的元素是右括号(')',']','}')
-
这时若栈是空的,则该右括号没有匹配的左括号,或者匹配的左括号在右括号的右边,那么字符串无效
-
再根据右括号对比栈顶元素,是否就是右括号所对应的左括号,若不是,则字符串无效
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n == 0 || 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)) {
// ①栈顶为空,则出现的右括号没有匹配的左括号;②栈顶元素不等于右括号对应的左括号;
//这两种情况简单说就是出现 多余的右括号
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
// 与右括号匹配成功,把栈顶(右括号对应的左括号)消除
stack.pop();
} else {
// 出现左括号,入栈操作,静待匹配的右括号出现
stack.push(ch);
}
}
//若stack为空,说明括号都正确匹配了,则字符串有效;stack不为空,则出现了多余的左括号
return stack.isEmpty();
}
}