给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
-
示例 1:
输入: “()”
输出: true -
示例 2:
输入: “()[]{}”
输出: true -
示例 3:
输入: “(]”
输出: false -
示例 4:
输入: “([)]”
输出: false -
示例 5:
输入: “{[]}”
输出: true
class Solution {
public boolean isValid(String s) {
if(s == null || s.length() == 0 )
return true;
//优化时间复杂度
if(s.length() % 2 == 1)
return false;
HashMap<String, Integer> map = new HashMap<>();
map.put("(", 1);
map.put(")", -1);
map.put("{", 2);
map.put("}", -2);
map.put("[", 3);
map.put("]", -3);
boolean flag = false;
//使用堆栈,大于0的字符入栈,若小于0的字符则与栈顶字符的值进行比较,是否为相反数
//是,则将栈顶元素弹栈。将下一个元素的值与栈顶元素的值进行比较,直到遍历结束,并判断栈是否为空,不为空说明不匹配,返回false。
//否,则直接返回false
Stack<String> stack = new Stack<>();
for(int i = 0; i < s.length(); i++){
String key = s.substring(i,i+1);
if(map.get(key) > 0){
stack.push(key);
continue;
}else{
if(!stack.isEmpty()){
if(map.get(stack.pop()) == -map.get(key)){
flag = true;
continue;
}else
return false;
}else
return false;
}
}
if(!stack.isEmpty())
return false;
return flag;
}
}
执行用时 :6 ms, 在所有Java提交中击败了73.65%的用户
内存消耗 :34 MB, 在所有Java提交中击败了89.44%的用户