http://blog.csdn.net/Lnho2015/article/details/50970920
给定一个字符串,只包含’(‘, ‘)’, ‘{‘, ‘}’, ‘[’ 和’]’这些字符,检查它是否是“有效”的。
括号必须以正确的顺序关闭,例如”()” 和”()[]{}”都是有效的,”(]” 和”([)]”是无效的。
分析:
本题考查的是栈结构,具有后进先出的特性。有效包含2个方面,第一个是如果是关闭的括号,前一位一定要刚好有一个开启的括号;第二个是最终结果,需要把所有开启的括号都抵消完。一个比较容易出错的地方是,遇到关闭括号时,要先判断栈是否已经空了。
public class Solution {
public boolean isValid(String s) {
char[] charArr=s.toCharArray();
List<Character> list=new ArrayList<>();
for(Character c:charArr){
if(c=='('||c=='{'||c=='['){
list.add(c);
}else{
if(list.size()==0){
return false;
}
char last=list.get(list.size()-1);
if(c==')'&&last!='('){
return false;
}else if(c=='}'&&last!='{'){
return false;
}else if(c==']'&&last!='['){
return false;
}
list.remove(list.size()-1);
}
}
if(list.size()!=0){
return false;
}
return true;
}
}
个人理解:在这道题中理解栈只是把相邻的开闭符号进行栈操作。
下边的代码自己写的,是错误代码
public static boolean isValid(String s) {
char[] charArr=s.toCharArray();
if(charArr.length%2!=0){
System.out.println("1");
return false;
}
for(int i=0;i<charArr.length;i=i+2){
char a = charArr[i];
int c = i+1;
char b = charArr[c];
if(a!=b){
System.out.println(a);
System.out.println(b);
return false;
}
}
return true;
}
https://leetcode.com/problems/valid-parentheses/discuss/9178/Short-java-solution
看leetcode的讨论区代码:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}