题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
思路一
暴力解答:设置一个栈变量,遇到左括号压入栈中,右括号遇到对应的左括号就取出栈顶元素,一旦右括号与栈顶元素不对应,就返回false。遍历完成之后,如果栈空,返回true,否则返回false。
class Solution {
public boolean isValid(String s) {
//Step1:判断特殊情况
if(s == null || s.length() == 0) return true;
//Step2:构建结果变量,辅助变量
// boolean ret = false;
Stack<Character> stack = new Stack<>();
//Step3:一次循环遍历,遇到左括号入栈,遇到对应的右括号,出栈
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
switch(c){
case '(':
case '[':
case '{':stack.push(c);break;
case ')':
if(!stack.isEmpty() && stack.pop() == '(') break;
else return false;
case ']':
if(!stack.isEmpty() && stack.pop() == '[') break;
else return false;
case '}':
if(!stack.isEmpty() && stack.pop() == '{') break;
else return false;
}
}
//Step4:如果栈空,说明是有效栈,否则是无效栈
if(stack.isEmpty()) return true;
else return false;
}
}
思路二
与思路一类似,用队列保存左括号,当其不是左括号时就需要判断,如果队尾元素与该字符不对应,就返回false;如果此时队空,也返回false,否则就继续。遍历完成后,如果队空,则返回true,否则返回false。
class Solution {
public boolean isValid(String s) {
//判断特殊情况
if(s == null || s.length() == 0) return true;
//设置一个哈希变量
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
//创建一个队列存储左括号
Deque<Character> dp = new ArrayDeque<>();
for(char c : s.toCharArray()){
if(c == '(' || c == '[' || c == '{'){
dp.push(c);
}else{
if(dp.size() == 0 || map.get(c) != dp.pop()) return false;
}
}
//有可能存在dp不为空
if(dp.isEmpty())return true;
else return false;
}
}