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 那么就把栈顶元素拿出去 当前元素如果是<c 继续放入栈中
            if(c>'a' &&(i==0|| c-ss[--i]!=1 )){
                return false;
            }
            if(c<'c'){
                ss[i++] = c;
            }
        } 
        return i==0;
    }
}

二、有效的括号(力扣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;
    }
}

每日一题:数青蛙(力扣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; // 有发出其它声音的青蛙,不符合要求
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'];
    }
}

解法二:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值