力扣刷题日常 1419.数青蛙

这道题的难点在于弄清楚题目规定的数青蛙的规则,这是非常关键的,我认为这道题对我最大的难点不是敲代码,而是给我一个字符串,我自己去数有多少只青蛙,然后得到正确的答案。

那么要想数出正确的答案,就要弄清楚题目的规则。

力扣刷题日常 1419.数青蛙_第1张图片

 题目所说的意思是发出一个完整的croak,就代表叫完一声,由于多只青蛙共同鸣叫,所以字符串由多个croak混合而成。

下面是我从第一次读题开始,不断踩坑的心路历程:

1.又是一个croak消掉,消不掉就反悔-1,难道是栈?实际上croak不一定必须相邻,比如ccrrooaakk也同样满足要求,与栈的应用模式有所不同

2.计每个字母的个数,全都相同就是合法字符串,然后看第一个字母有几次,就有几只,后来发现,一只青蛙不是只叫一声,他可能叫了一声,后面又跟着其他青蛙叫了,而题目要的是最少的青蛙个数

3.先把字符串存在的croak消掉,他们可以单独叫,剩下的去计数。后来发现青蛙的个数似乎与单独存在的croak并木有关系。

到这里我对于这个题目的理解都是有偏差的,我没有完全弄懂这个题目的规则。

下面我来介绍我在通过后理解的规则(我认为是正确的规则)

如果题目用croak字符串来描述青蛙叫有些抽象的话,那我们来把抽象具体化。

加上一声croak是把呱来拉长,也就是呱~~这一声,需要拉长直到呱完c r o a k五个字母。然后在这期间,其他青蛙也可以呱~,但这只青蛙显然不行,因为他正在呱。

那么,也就是c表示青蛙开始呱,k表示已经叫完了,也就是可以叫第二声了。显然,如果还没有叫完,又遇到一个c,那就是又多了一只青蛙在呱,如果遇到了一个k,也就是一只青蛙已经叫完了,如果后面再遇到一个c的话,也可以是这只青蛙来叫。

那么我们思路就很明朗了,在遇到对应k前遇到一个c就多一只青蛙,遇到一个k就解放一只青蛙(意思就是它又可以叫了)。

然后弄懂了这个逻辑,我们开始说我们的思路:

1.定义一个数组来统计croak每个字母的个数。

2.五个字符c出现了才会有r,然后依次有oak,所以,后续的字母不能比前面的字母多,否则就不合法。

3.每个字符出现次数最后一定都相等,不然不合法。

4.假设初始有一只青蛙,在遇到k之前都表示这只青蛙都没有被解放,一直还在叫,此时k的个数为0,那如果这个时候又遇到了c,那就需要多一只青蛙了;如果遇到了一个c,但是k的个数不是0,那就说明前面有一只青蛙被解放了,那就让这只青蛙叫,相应的我们k的个数要减一,表示被解放这只青蛙又要叫了,如果遇到了c,k的个数又为0,那就说明又有青蛙叫,但没有解放的青蛙,那就要加一只。

5.由于我们对k的个数进行了加减操作,所以我们最后在统计五个字符是否相等时,通过总数减前四个来判断k的个数是否与其他四个相等。

最终得出最少要多少只青蛙,真的很难懂这个题的规则,呱~~~

最后纪念力扣两百题,这是一个里程碑,我也会继续坚持下去,并在这里分享我的日常。

以下是我的代码:

//叫的我脑壳疼的229只青蛙
class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
            int count=1;
            var site=new HashMap();
            int len=croakOfFrogs.length();
            int[] arr =new int[5];
           // 遍历一边计数,一边统计青蛙个数
            for(int i=0;iarr[4]&&arr[4]==0){
                       count++;
                    }else if(arr[0]>arr[4]&&arr[4]!=0){
                        arr[4]--;
                    }
                    arr[0]++;
                }
                if(croakOfFrogs.charAt(i)=='r'){
                    arr[1]++;
                    if(arr[1]>arr[0])return -1;
                }
     
                if(croakOfFrogs.charAt(i)=='o'){
                    arr[2]++;
                    if(arr[2]>arr[1])return -1;
                }
                if(croakOfFrogs.charAt(i)=='a'){
                    arr[3]++;
                    if(arr[3]>arr[2])return -1;
                }
                if(croakOfFrogs.charAt(i)=='k'){
                     arr[4]++;
                     if(arr[4]>arr[3])return -1;
                }
            }
            //判断字符串中每个字母出现次数是否一致
            site.put(arr[0],0);
            for(int j=0;j<4;j++){
                int x=site.getOrDefault(arr[j],-1);
                if(x==-1){
                    return -1;
                }
            }
            if(arr[0]!=len-4*arr[0])return -1;
            return count;

    }
}

 

 

你可能感兴趣的:(算法,leetcode,java)