20.有效的括号

一言以概之,由于栈结构的特殊性,非常适合用来做匹配、对称类问题。

public boolean isValid(String s) {

    Deque<Character> deque=new LinkedList<>();

    for(int i=0;i<s.length();i++) {

        char ch=s.charAt(i);
        if(ch=='{') {
            deque.push('}');
            }
        else if(ch=='(') {
            deque.push(')');
        }
        else if(ch=='[') {
            deque.push(']');
        }
        else if(deque.isEmpty()||deque.peek()!=ch) {
            return false;
        }
        else {
            deque.pop();
        }
    }
    return deque.isEmpty();

}
public boolean isValid2(String s) {        
    Stack<Character> stack=new Stack<>();    
    Map<Character,Character> map=new HashMap<Character,Character>(){
        {
            put('}','{');
            put(']','[');
            put(')','(');
        }
    };

    for(char ch : s.toCharArray()) {
        if(!stack.isEmpty()&&map.containsKey(ch)) {
            if(map.get(ch)==stack.peek()) {
                stack.pop();
            }
            else {
                return false;
            }
        }
        else {
            stack.push(ch);
        }            
    }
    return stack.isEmpty();        
}

思路简述

这道题比较简单,就是利用了栈先进后出的特性,然后对括号进行匹配。
因为括号的特性,一对的左括号肯定比和它匹配的右括号先进栈。所以比较便捷的方法就是对右括号进行判断,看看栈里有没有和它匹配的左括号。如果先判断左括号的话,此时要找在左括号后面的右括号就会很麻烦。

具体来说,就是对输入的字符串进行判断,如果是左括号,那么就压入栈中。如果是右括号,那么就看此时栈顶元素是不是和它可以匹配的左括号(是栈顶元素的原因是按照判断顺序,可以匹配的左右括号之间一定没有其他元素)。如果是,就把那个左括号抛出栈,然后继续判断。如果不是,就说明这个右括号没有匹配的元素,就判断出错。
然后最后判断一下栈是否为空,如果不为空,说明有左括号剩余在栈中,那么就返回false。
然后下面两个方法本质上是一样的,就是第二种方法提前将左右括号存储到了hashmap中。

1047. 删除字符串中的所有相邻重复项

在这里插入图片描述

public static String removeDuplicates(String s) {        
    Stack<Character> stack=new Stack<>();        
    for(char ch: s.toCharArray()) {            
        if(!stack.isEmpty()&&ch==stack.peek()) {                
            stack.pop();
        }
        else {
            stack.push(ch);
        }            
    }
    String str2=stack.toString();
    String str="";
    while(!stack.isEmpty()) {
        str=stack.pop()+str;//注意这个相加的顺序问题
    }
    return str;    
}

思路简述

这个题比较简单,一开始在想abaaab里的aaa怎么同时消除,后来发现他并不会有这种情况。所以难点就大大降低了。
简单来说,在判断每一个新的字符时,看看它是不是和栈顶元素相同就可以了。如果相同,就删除栈顶元素,如果不相同,就将这个字符push进栈。

可能麻烦一点的是最后要再建立一个string字符串,来记录下栈内的元素,虽然栈是有tostring函数的,但是看看效果图,如果直接用这个函数,不会通过。

正常输出应该如下图所示:


leetcode     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!