题目
给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
public class Solution {
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean isValid (String s) {
/**
* 1、将所有字符保存
* 2、遍历所有字符,利用栈和编译原理符号栈的原理
* (1)依次遍历
* (2)如果遇到“)}]”中的符号,就和上一个比较,因为只有成对出现,切没有交叉才为true
* (3)如果第一个是“)}]”中的符号,就直接返回false
* (4)如果遇到“({[”就继续
* (5)如果匹配上了,就将这两个符号全部出栈
*/
char[] s1 = s.toCharArray();
ArrayList fhList = new ArrayList<String>();
//利用arraylist保存所有符号
for(int i = 0; i < s1.length; i++){
String k = s1[i]+"";
if("[".equals(k) || "]".equals(k) ||
"(".equals(k) || ")".equals(k) ||
"{".equals(k) || "}".equals(k)){
fhList.add(k);
}
}
//符号个数必须是偶数个
int fhlegth = fhList.size();
if(fhlegth % 2 == 1){
return false;
}
for(int i = 0; i < fhList.size(); i++){
//获取当前位置符号
String last = (String) fhList.get(i);
//需要出栈的符号
String pop = "";
//遇到反方向的符号,切不是第一个时,就暂存上一个字符,用于和当前字符比较
if(")}]".contains(last) && i-1 >= 0){
pop = (String) fhList.get(i-1);
}else if(")}]".contains(last)){
return false;
}
//开始匹配,如果匹配上就“出栈”,并且长度渐少
if(")".equals(last)){
if(!"(".equals(pop) ){
return false;
}
fhList.remove(i);
fhList.remove(i-1);
i = i - 2;
}else if("]".equals(last) ){
if(!"[".equals(pop)){
return false;
}
fhList.remove(i);
fhList.remove(i-1);
i = i - 2;
}else if("}".equals(last)){
if(!"{".equals(pop)){
return false;
}
fhList.remove(i);
fhList.remove(i-1);
i = i - 2;
}
}
//没有全部出栈,即没有全部匹配
if(fhList.size() > 0){
return false;
}
return true;
}
public static void main(String[] args) {
String test = "[(){}]";
Solution solution = new Solution();
System.out.println(solution.isValid(test));
}
}
个人解法,不代表最优解,有想法可以一起交流!!!