题目链接:Valid Parentheses
这又是一道很常见的题目,使用栈是最常见的解法,因为对在java中使用栈不够熟悉,参考了一下网上代码的编写
基本思路如下:
1、首先判断字符串的长度,如果为奇数个,那么肯定不是合格的括号字符串
2、如果为偶数个,则判断第一个括号是否为左半边的:’(‘,’[’ 或者 ‘{‘,如果是则将其压入栈,不是的话,直接返回false
2、接下来依次依次读取字符串中的括号,如果为左半边的括号,那么则压栈;不是的话就是看其与栈顶字符是否为一对括号;
3、如果是一对,那么栈顶字符出栈,继续循环;不是一对的话,就返回false
4、循环结束后,如果栈为空,则表示为合格的括号字符串,否则不合格,返回false
代码如下:
public class Solution {
public boolean isValid(String s) {
int len = s.length();
Stack stack = new Stack();
if(len%2 ==1)
return false;
else
{
if(s.charAt(0)=='('||s.charAt(0)=='['||s.charAt(0)=='{')
stack.push(s.charAt(0));
else
return false;
for(int i=1;i<len;i++)
{
if(s.charAt(i)=='('||s.charAt(i)=='['||s.charAt(i)=='{')
stack.push(s.charAt(i));
else
{
Character peek = (Character)stack.peek();
if((peek=='('&&s.charAt(i)==')') || (peek=='['&&s.charAt(i)==']') ||(peek=='{'&&s.charAt(i)=='}'))
stack.pop();
else
return false;
}
}
}
return stack.isEmpty();
}
}
更新于2017.10.22
重新做了一遍这道题,这次是自主完成的。
看到的第一想法依旧是使用栈的原理,但是不记得java中栈如何使用,所以利用新加一个字符串tmp来实现栈的原理,即当为左括号时,将其加入到tmp,如果不为,则判断下,和tmp尾部的字符是否可以配对,可以的话,就将尾部字符从tmp中去掉,并且长度减1,否则的话,否则直接返回 false。基本原理和上诉方法一是一致的,只是实现的过程不一样
代码如下:
public boolean isValid(String s) {
int len = s.length();
String tmp = "";
int lentmp = 0;
if(len%2==1)
return false;
if(s.charAt(0)==')'||s.charAt(0)=='}'||s.charAt(0)==']')
return false;
for(int i=0;i<len;i++){
if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
tmp += s.charAt(i);
lentmp ++;
}
else {
String sp = String.valueOf(tmp.charAt(lentmp-1))+String.valueOf(s.charAt(i));
if(sp.equals("()")||sp.equals("{}")||sp.equals("[]")){
tmp = tmp.substring(0,lentmp - 1);
lentmp--;
}
else
{
return false;
}
}
}
if(lentmp==0){
return true;}
else{
return false;
}
}