• day82【Leetcode】



    前言

    1、检查替换后的词是否有效
    2、有效的括号
    3、数青蛙


    一、检查替换后的词是否有效(力扣1003)

    题目描述:

    在这里插入图片描述
    示例:
    在这里插入图片描述

    分析:

    字符a:类似左括号,直接入栈。
    字符b:如果栈为空,或者栈顶不为a,则返回false,否则将栈顶修改为b
    字符c:如果栈为空,或者栈顶不为b,则返回false,否则弹出栈顶。
    循环结束后如果栈为空,则返回true,否则返回false;

    class Solution {
        public boolean isValid(String s) {
            char[] ss = s.toCharArray();
    
            int i = 0;
            for(char c:ss){
                //栈顶元素不是a,但是此时栈为空
                //或者栈顶元素不是a,此时栈不为空,那么需要判断当前元素与栈顶元素之间是否相差1
                //如果相差1 那么就把栈顶元素拿出去 当前元素如果是
                if(c>'a' &&(i==0|| c-ss[--i]!=1 )){
                    return false;
                }
                if(c<'c'){
                    ss[i++] = c;
                }
            } 
            return i==0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    二、有效的括号(力扣20)【1003类似题目】

    题目描述
    在这里插入图片描述

    示例:
    在这里插入图片描述
    分析:
    与上一题解法类似

    class Solution {
    public boolean isValid(String s) {
            char[] ss = s.toCharArray();
            char[] right = {')',']','}'};
            char[] left = {'(','[','{'};
            int i = 0;
            for(char c: ss){
                if(right[0]==c && (i==0||ss[--i]!=left[0]))
                    return false;
                if(right[1]==c && (i==0||ss[--i]!=left[1]))
                    return false;
                if(right[2]==c && (i==0||ss[--i]!=left[2]))
                    return false;
                for(char l:left){
                    if(c==l){
                        ss[i++] = c;
                    }
                }
    
            }
            return i==0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    每日一题:数青蛙(力扣1419)

    题目描述:
    在这里插入图片描述
    示例:
    在这里插入图片描述

    分析:

    croak
    遍历给定的字符串:
    如果当前字符是c,那么需要判断k是否在之前出现过,如果出现过,可以继续用这一只青蛙chars[c]++,chars[k]--,如果没有出现过则新开一只青蛙chars[c]++;
    如果当前字符是r,那么需要判断c是否在之前出现过,如果出现过,可以继续用这一只青蛙chars[r]++,chars[c]--,如果没有出现过则不符合题目要求 直接return false;
    同理 o a k 一样
    最后一定要注意类似ccccccrrooaakk这种情况
    需要多加一个条件

    if (chars['c'-'a'] > 0 || chars['r'-'a'] > 0 || chars['o'-'a'] > 0 || chars['a'-'a'] > 0)
                return -1; // 有发出其它声音的青蛙,不符合要求
    
    • 1
    • 2
    class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
            char[] chars = new char[26];
            char[] target = croakOfFrogs.toCharArray();
            for(int i=0;i<target.length;i++){
                if(target[i]=='c'){
                    //先去看看有没有出现过k
                    if(chars['k'-'a']==0){
                        //之前没有出现过青蛙
                        chars['c'-'a']++;
                    }else{
                        //复用青蛙
                        chars['c'-'a']++;
                        chars['k'-'a']--;
                    }
                }else if(target[i]=='r'){
                    //先去看看有没有出现过c
                    if(chars['c'-'a']==0){
                        //之前没有出现过c
                        return -1;
                    }else{
                        chars['r'-'a']++;
                        chars['c'-'a']--;
                    }
                }else if(target[i]=='o'){
                    //先去看看有没有出现过r
                    if(chars['r'-'a']==0){
                        //之前没有出现过r
                        return -1;
                    }else{
                        chars['o'-'a']++;
                        chars['r'-'a']--;
                    }
                }else if(target[i]=='a'){
                    //先去看看有没有出现过o
                    if(chars['o'-'a']==0){
                        //之前没有出现过o
                        return -1;
                    }else{
                        chars['a'-'a']++;
                        chars['o'-'a']--;
                    }
                }else if(target[i]=='k'){
                    //先去看看有没有出现过a
                    if(chars['a'-'a']==0){
                        //之前没有出现过a
                        return -1;
                    }else{
                        chars['k'-'a']++;
                        chars['a'-'a']--;
                    }
                }else{
                    return -1;
                }
            }
            if (chars['c'-'a'] > 0 || chars['r'-'a'] > 0 || chars['o'-'a'] > 0 || chars['a'-'a'] > 0)
                return -1; // 有发出其它声音的青蛙,不符合要求
            return chars['k'-'a']==0?-1:chars['k'-'a'];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    解法二:

    class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
            int res = 0;
            char[] cnt = new char[256];
            char[] target = croakOfFrogs.toCharArray();
            for(char c:target){
                cnt[c]++;
                int cnt1 = cnt['c']-cnt['r'];
                int cnt2 = cnt['r']-cnt['o'];
                int cnt3 = cnt['o']-cnt['a'];
                int cnt4 = cnt['a']-cnt['k'];
                if(cnt1<0 || cnt2<0 || cnt3<0 || cnt4<0){
                    return -1;
                }
                if(c=='c'){
                    res = cnt['c']-cnt['k']>res?cnt['c']-cnt['k']:res;
                }
            }
            if(cnt['c']!=cnt['r'] || cnt['c']!=cnt['o'] || cnt['c']!=cnt['a'] || cnt['c']!=cnt['k']){
                return -1;
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    Visual Studio 2022安装教程
    JVM调优实践
    第5章:程序控制结构
    硬件科普系列之内存篇
    自动化测试开发 —— 如何封装自动化测试框架?
    1.14 - 流水线
    力扣.82删除链表中的重复元素(java语言实现)
    估值一亿的AI核心代码
    Java内存模型-Java Memory Model(JMM)-可见性、原子性、有序性
    Linux系统(Centos7)配置与管理Apache服务器练习题
  • 原文地址:https://blog.csdn.net/qq_42338744/article/details/130480579