- 问题描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 示例 4: 输入:s = "([)]" 输出:false 示例 5: 输入:s = "{[]}" 输出:true 提示: 1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成
解题方法1:
如果这个括号是有效的,那么一定存在一个有效且连续的字符串,并且消除连续的字符串之后也至少存在一个连续且有效的字符串。我们可以消除给定字符串中有效的字符串,支持没有有效的字符串,这样通过判断字符串的长度就可以进行判断。
代码:
int n = s.length(); if (n % 2 == 1) { return false; } while (s.contains("()") || s.contains("[]") || s.contains("{}")) { s = s.replace("()", "").replace("[]", "").replace("{}", ""); } return s.length() == 0;
执行结果:
当然,这个方法的执行效率并不是很好。
解题方法2:
使用 [ 栈 ]这一数据结构解决问题。
对给定的字符串进行遍历,在遇到左括号时因为要去后续字符进行判断,故先将左括号放到栈顶,以待后续判断。
当遇到右括号时,需要一个左括号和其相匹配,将栈顶的字符取出与当前的右括号进行判断,若不匹配,则返回 false
注意以下三种情况:
1. 遇到右括号,但是栈为空,返回 false
2. 遇到右括号,但是栈顶的字符与之不匹配,返回 false
3. 字符串匹配完成之后,栈不为空,返回 false
代码:
int n = s.length();
if(n % 2 == 1){
return false;
}
Map<Character,Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
Deque<Character> deque = new LinkedList<>();
for(int i = 0;i < n;i++){
char cc = s.charAt(i);
if(map.containsKey(cc)){
if(deque.isEmpty() || deque.peek() != map.get(cc)){
return false;
}
deque.pop();
}else {
deque.push(cc);
}
}
return deque.isEmpty();
执行结果:
PS:求点赞