题目描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

思路:
判断括号序列是否合法的问题,一般都是用栈这种数据结构去做。
本题中,我们可以定义一个Stack,遍历字符串,当遇到左括号:'(', '[',,'{'或者栈为空时,就将当前位置的字符入栈。如果遇到右括号时,就比对当前字符和栈顶字符是不是对应的括号。如果不对应,那么直接返回false,说明这个字符串不是合法的括号序列,如果是对应的括号,那么就把栈顶的字符出栈,进行下一次循环。 最终,如果栈是空,就返回true,栈不为空,就返回false。代码如下:
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean isValid (String s) {
// write code here
char[] arr = s.toCharArray();
int length = arr.length;
Stack<Character> stack = new Stack();
for(int i=0; i < length; i++ ) {
if(stack.isEmpty() || arr[i]=='(' || arr[i]=='[' || arr[i]=='{') {
stack.push(arr[i]);
continue;
}
if(arr[i]=='}' && stack.peek()!= '{')
return false;
else if( arr[i]==')' && stack.peek()!= '(')
return false;
else if(arr[i]==']' && stack.peek()!= '[')
return false;
else if(stack.isEmpty())
return false;
stack.pop();
}
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
}
解题中遇到的问题:
在遇到右括号时,与栈顶元素对比的方法我用的stack.pop。这会导致改变栈的结构。比如,如果当前if条件不满足,进入到下一个if,但是此时已经把栈顶元素出栈了。经过debug,把pop改为peek方法,在所有if else比较完之后再出栈。
网友评论