栈的拿手好戏
有效的括号
(1) 题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
(2) 题解代码
朴素思想实现
class Solution {
static boolean isLeft(char c){
return c == '(' || c == '{' || c == '[';
}
static boolean isRight(char c){
return c == ')' || c == '}' || c == ']';
}
static boolean weAreFamliy(char c, char see){
if(c == ')'){
if(see == '('){
return true;
}else{
return false;
}
}
if(c == '}'){
if(see == '{'){
return true;
}else{
return false;
}
}
if(c == ']'){
if(see == '['){
return true;
}else{
return false;
}
}
return true;
}
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for(int i=0; i<s.length() ; i++){
char cur = s.charAt(i);
if(isLeft(cur)){
stack.push(cur);
}
if(isRight(cur)){
if(stack.isEmpty()){
return false;
}
boolean result = weAreFamliy(cur,stack.pop());
if(!result){
return false;
}
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
String s ="()[]{}";
boolean result = isValid(s);
System.out.println(result);
}
}
改写映射关系
class Solution {
boolean isLeft(char c,HashMap map){
return map.values().contains(c);
}
boolean isRight(char c,HashMap map){
return map.keySet().contains(c);
}
boolean weAreFamliy(char c, char see,HashMap map){
return map.get(c).equals(see);
}
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
HashMap<Character,Character> map = new HashMap<>();
map.put(')','(');
map.put('}','{');
map.put(']','[');
for(int i=0; i<s.length() ; i++){
char cur = s.charAt(i);
if(isLeft(cur,map)){
stack.push(cur);
}
if(isRight(cur,map) &&(
stack.isEmpty() || !weAreFamliy(cur,stack.pop(),map)
)){
return false;
}
}
return stack.isEmpty();
}
}
(3) 算法笔记
- 建立左右括号的映射关系,注意,需要把右括号设置为键,左括号设置为值,
- 因为后续匹配的过程需要根据右括号查找左括号。
- 遍历字符串,遇到左括号进压入栈,遇到右括号需要进行判断
- 右括号是否和栈顶的左括号匹配,如果不匹配,直接返回
false
; - 如果匹配,继续遍历字符串。
- 右括号是否和栈顶的左括号匹配,如果不匹配,直接返回