题目描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
源代码:
package pid20;
import java.util.*;
public class Solution {
private HashMap<Character,Character> mappings;
public Solution(){
this.mappings = new HashMap<Character,Character>();
this.mappings.put(')','(');
this.mappings.put('}', '{');
this.mappings.put(']', '[');
}
public boolean isValid(String s){
//实例化一个栈以供后面使用
Stack<Character> stack = new Stack<Character>();
for(int i = 0;i < s.length();i++){
char c = s.charAt(i);//取出对应位置上的字符
//若当前字符是一个右括号
if(this.mappings.containsKey(c)){
//取出栈顶元素
char topElement = stack.empty()?'#':stack.pop();
if(topElement == this.mappings.get(c)){
//继续for循环,直到循环体结束返回一个true
}else{//配对不成功
return false;
}
}else if(this.mappings.containsValue(c)){
stack.push(c);
}
}
//循环体顺利执行结束,若栈中没有剩余的字符,那么全部匹配成功
return stack.isEmpty();
}
public static void main(String[] args) {
Solution so = new Solution();
String str1 = "([{}()[[]]])";
System.out.println("用例1:"+so.isValid(str1));
String str2 = "{[()}";
System.out.println("用例2:"+so.isValid(str2));
}
}
知识点:
HashMap:
定义键值对的映射,需要先引入java.util.HashMap; 工具包。
实例化时需要指明键与值对应的类型:
HashMap<K, V> mappings = new HashMap<K,V>();
用到的方法如下:
添加键-值对:
V put(K key, V value);
取出键对应的值:
V get(K key);
检查是否包含某键:
boolean containsKey(K key);
检查是否包含某值:
boolean containsValue(V value);
Stack:
栈,只允许在尾部插入元素的数据结构,需要先引入java.util.Stack;工具包。
实例化时需要指明栈中元素的类型:
Stack< V > = new Stack< V >();
用到的方法如下:
检查是否为空:
boolean isEmpty();
入栈:
E push(E item);
出栈(取栈顶元素):
E pop();
思考
- 用HashMap做左右括号匹配非常合适;
- 括号串要合法,必须满足内部可以匹配,直到最终不剩,做这个过程没有比先进后出的栈更合适的数据结构了。