描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
数据范围:字符串长度0≤n≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
示例1
输入:
"["
返回值:
false
复制
示例2
输入:
"[]"
返回值:
true
思路分析:
这里可以使用栈,根据栈的先进后出,后进先出的特点,来存储半边的括号,当出现左括号,向栈中压入右括号,然后比较栈中压入的右括号与字符串中当前的括号相比,来判断括号是否成双成对。
代码:
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean isValid (String s) {
// write code here
Stack<Character> stack=new Stack<Character>();
//将字符串转换为字符数组
char[] c=s.toCharArray();
for(int i=0;i<c.length;i++){
if(c[i]=='('){
stack.push(')');
}else if(c[i]=='['){
stack.push(']');
}else if(c[i]=='{'){
stack.push('}');
}else if(stack.isEmpty()||stack.pop()!=c[i]){
//如果栈为空或者栈压出的元素不是该符号,则说明不是成双成对的括号
//这里一个小技巧就是,只要stack.isEmpty()为false,那么一定会去判断stack.pop()!=c[i],就会执行栈压出的操作
return false;
}
}
//最后判断压入栈中的元素是否全部比较完成,是则返回true,还有剩余则说明有括号没有配对
return stack.isEmpty();
}
}