题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
思路分析
这是一道简单的利用栈就可以完成的题目,对于这些题目我们需要注意的就是什么时候才能满足弹栈的条件,这个是最重要的,这里就很简单如果入栈元素为右括号,且栈顶元素为相对应的左括号才能弹栈,否则直接返回false即可。
Java代码
public boolean isValid(String s) {
//""字符串
if("".equals(s)){
return true;
}
//左括号入栈
//遇到右边括号就查看前一个是否为对应的,如果是则继续,不是则直接返回false
ArrayList<Character> stack=new ArrayList();
char[] chars=new char[s.length()];
s.getChars(0,s.length(),chars,0);
for (int i = 0; i < chars.length; i++) {
if(chars[i]=='{'||chars[i]=='['||chars[i]=='('){
stack.add(chars[i]);
}else{
if(stack.size()==0)
return false;
switch (chars[i]){
case '}':
if(stack.get(stack.size()-1)=='{'){
stack.remove(stack.size()-1);
break;
}else{
return false;
}
case ']':
if(stack.get(stack.size()-1)=='['){
stack.remove(stack.size()-1);
break;
}else{
return false;
}
case ')':
if(stack.get(stack.size()-1)=='('){
stack.remove(stack.size()-1);
break;
}else{
return false;
}
}
}
}
if (stack.size()==0){
return true;
}
return false;
}
简化思路
这种成对出现的,key值唯一的利用哈希表来简化书写,利用linkedList来作为栈的实现
示例代码
public boolean isValidV2(String s) {
//""字符串
if("".equals(s)){
return true;
}
Map<Character,Character> table=new HashMap<Character, Character>(){{
put('{','}');put('[',']');put('(',')');put('?','?');
}};
LinkedList<Character> stack=new LinkedList<Character>(){{
//偷偷填充一个?用于stack为空是remove报错
add('?');
}};
for (char c : s.toCharArray()) {
if(table.containsKey(c)){
stack.add(c);
}else{
if(table.get(stack.removeLast())!=c)
return false;
}
}
return stack.size()==1;
}
上述代码虽然因为创建了一些对象的原因,用时3ms但是很优雅!!