题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
示例1
输入: "()"
输出: true
示例2
输入: "()[]{}"
输出: true
示例3
输入: "(]"
输出: false
示例4
输入: "([)]"
输出: false
示例5
输入: "{[]}"
输出: true
分析
括号匹配问题在数据结构中是利用栈的先进后出特点实现的,但是用C语言实现需要创建栈,写相应的初始化进栈退栈等操作,还要判断栈顶的左括号是否与当前的右括号匹配,代码会有点长,这里用Java实现,可以简洁很多。
思路:
-
先将可能出现的三种括号以键值对的形式存入 Map 集合中,注意应该 右括号作为键,左括号作为值 ;
-
开始遍历参数字符串时,判断:如果遇到 左括号 就将它连接到另一个字符串 str(初始时设为空串);否则(即遇到右括号)做一个判断:若 str 为空串或在集合中以这个右括号为键取出的值不等于字符串 str 的最后一个字符,就返回 false,否则更新字符串 str ,将最后一个字符去掉,对应C语言操作中,如果匹配就 退栈 的操作;
-
在参数字符串遍历完后,再 判断字符串 str 是否为空,如果是空的,代表括号匹配成功,否则表示有左括号没有与之对应的右括号,此时匹配失败。
代码
class Solution {
public boolean isValid(String s) {
Map<Character, Character> map = new HashMap<Character, Character>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{'); //将键值对存入Map集合中
String str = ""; //定义临时字符串,初始状态为空
for(int i = 0; i < s.length(); i++) { //遍历参数字符串
char c = s.charAt(i);
if(c == '(' || c == '[' || c == '{') {//是左括号就连接到str字符串之后
str = str.concat(String.valueOf(c));
}else {//否则再进行判断
if(str.length()-1 < 0 || map.get(c) != str.charAt(str.length()-1))
return false; //若 str 为空串或在集合中以这个右括号为键取出的值不等于字符串 str 的最后一个字符,就返回 false
str = str.substring(0, str.length()-1); //否则将str串中最后一个字符去掉
}
}
//在参数字符串遍历完后
if(str.length() == 0) //判断字符串 str 是否为空
return true; //是空的,代表括号匹配成功
return false; //否则表示有左括号没有与之对应的右括号,此时匹配失败
}
}