• 2.14
    • 如果遇到右括号,直接进入判断头部是不是符合 是否 pop,如果遇到左括号直接 push
class Solution {
    public boolean isValid(String s) {
        Map<Character,Character> map = new HashMap<>();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
        Deque<Character> stack = new LinkedList<>();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(map.containsKey(ch)){
                if(stack.isEmpty()||stack.peek()!=map.get(ch)){
                    return false;
                }
                stack.pop();
            }else{
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}
  • 1.31
    • 怎么还跟之前的思路不一样了
class Solution {
    public boolean isValid(String s) {
        Map<Character,Character> map = new HashMap<>();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
 
        Deque<Character> stack = new LinkedList<>();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(map.containsKey(ch)&&map.get(ch)==stack.peek()){
                stack.pop();
            }else{
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}
  • 1.20
    • 简单!!!!!
    • 但是我这个思路不符合快速失败原则,如果都是左括号,空间复杂度就on 了,不过自己想的没毛病
class Solution {
    public boolean isValid(String s) {
        if(s.length()%2==1) return false;
        Map<Character,Character> map = new HashMap<>();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
 
        Deque<Character> stack = new LinkedList<>();
 
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(!map.containsKey(ch)||stack.peek()!=map.get(ch)){
                stack.push(ch);
            }else{
                stack.poll();
            }
        }
        if(stack.isEmpty()){
            return true;
        }
        return false;
        
    }
}

api

  • 11.18
    • map初始化{{put(’)’,’(’)}}
    • put存放时,右边为key,左边为val,在判断时,看取出的字符是不是待匹配(右边)的符号
      • 是的话:判断直接失败还是弹出匹配
      • 不是的话,直接存入
class Solution {
    public boolean isValid(String s) {
        if(s.length()%2==1){
            return false;
        }
        Map<Character,Character> pair = new HashMap<>(){
            {
                put(')','(');
                put('}','{');
                put(']','[');
            }
        };
        
        Deque<Character> stack = new LinkedList<>();
 
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(pair.containsKey(ch)){
                if(stack.isEmpty()||stack.peek()!=pair.get(ch)){
                    return false;
                }
                stack.pop();
            }else{
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}
类型写法说明
数组a.length语言级属性,无方法
Strings.length()对象方法
集合list.size()对象方法,惯例叫 size
  1. 只有数组是原生的,用length就行
  2. Map类型的阔号对声明
Map<Character,Character> pairs = new HashMap<>() 
  {{put(')', '(');
    put(']', '[');
    put('}', '{');}};
  1. 栈的声明
Deque<Character> stack = new LinkedList<>();
  1. 取string中的字符串
	char ch = s.charAt(i);
  1. 判断map中是否存在一个key(contains加s)
pair.containsKey(key)
  1. 判断map是否存在某个value
pair.get(value)
  1. pop()里不用放东西