【数据结构与算法】一文秒杀三道括号题

184 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

接下来的时间里,Sivan带着大家一起学习数据结构与算法哟!

队列/栈数据结构

秒杀三道括号题

括号类的题目一般都是和栈联系在一起的。

LeetCode 20

本题可以使用栈数据结构,遇到左括号就放入,如果遇到右括号,就弹出栈比较。

class Solution {
    public boolean isValid(String s) {
        Stack <Character> stack = new Stack<Character>();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            //如果是左括号,就入栈。
            if(ch =='('|| ch=='{' || ch=='[' ){
                stack.push(ch);
            }else {
                if(!stack.empty() && isoper(ch)==stack.pop()){
                        
                    }else
                        return false;
            }
        }
        return stack.empty();
    }
    public static char isoper(char c){
        if(c==')')  return '(';
        if(c==']')  return '[';
         return '{';
    }
    }

LeetCode 921

  • 使用栈解决:
class Solution {
    public int minAddToMakeValid(String s) {
        int ret=0;
        Stack <Character> stack = new Stack <>();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(ch=='('){
                stack.push(ch);
            }
            if(ch==')' && !stack.empty()){
                stack.pop();
            }else if(ch==')' && stack.empty()){
                ret++;
            }
        }
        return stack.empty() ? ret:ret+stack.size();
    }
}


  • 使用普通变量解决:

class Solution {
    public int minAddToMakeValid(String s) {
        int ret = 0;
        //左右括号匹配数,如果需要右括号,需求+1,存在右括号,需求-1.
        int need = 0;
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(ch=='('){
                need++;
            }
            if(ch==')' && need!=0){
                need--;
                //如果此时没有需求,说明只剩右括号了,此时ret要+1,代表匹配左括号。
            }else if(ch==')' && need==0){
                ret++;
            }
        }
        return need+ret;
    }
}


LeetCode 1541

class Solution {
    public int minInsertions(String s) {
        //need为右括号的需求量。res为主动插入语的括号。
        int  res = 0,need=0;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='('){
                need+=2;
                //说明此时需要一个右括号。
                if(need%2==1){
                    //插入一个右括号。
                    res++;
                    //右括号需求-1。
                    need--;
                }
            }
            if(s.charAt(i)==')'){
                need--;
                //当need=-1,说明有一个多余的右括号,所以右括号的需求变为1,左括号需求+1.
                if(need==-1){
                    //插入一个左括号。
                    res++;
                    need=1;
                }
            }
        }
        return res+need;
    }
}

写在最后⭐
博主也是边学习边写作,如有异议敬请指出~
如果喜欢这篇文章的话,别忘了给博主点一个赞关注⭐哟!
你的关注就是对我的最大鼓励!