# 数青蛙

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。

请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。

要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成,请返回 -1 。

示例 1:

输入:croakOfFrogs = "croakcroak" 输出:1 解释:一只青蛙 “呱呱” 两次

示例 2:

输入:croakOfFrogs = "crcoakroak" 输出:2 解释:最少需要两只青蛙,“呱呱” 声用黑体标注 第一只青蛙 "crcoakroak" 第二只青蛙 "crcoakroak"

示例 3:

输入:croakOfFrogs = "croakcrook" 输出:-1 解释:给出的字符串不是 "croak" 的有效组合。

提示:

1 <= croakOfFrogs.length <= 105;

字符串中的字符只有 'c', 'r', 'o', 'a' 或者 'k'

var minNumberOfFrogs = function(croakOfFrogs) {

    let count = 0;
    let croakingCount = 0;
    let croaking = {
        c:{
            count: 0,
        },
        r:{
            count: 0,
            last: 'c'
        },
        o:{
            count: 0,
            last: 'r'
        },
        a:{
            count: 0,
            last: 'o'
        },
        k:{
            count: 0,
            last: 'a'
        },
    };

    const length = croakOfFrogs.length;

    for(let i=0;i< length; i++) {
        const char = croakOfFrogs[i];
        const {last} = croaking[char];
        croaking[char].count ++;
        if (last) {
            croaking[last].count --;

            if (croaking[last].count === -1) {
                return -1;
            }

            if (char === 'k') {
                croakingCount --; 
            } 
        } else {
            croakingCount ++;
        }

        if (croakingCount > count) {
            count = croakingCount;
        }
    }

    const keys = Object.keys(croaking);
    const isFinish = keys.some(char =>  croaking[char].count !== 0 && char !== 'k');
    if (isFinish) {
        return -1;
    }

    return count;
};
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
var minNumberOfFrogs = function(croakOfFrogs) {
    if (croakOfFrogs%5) {
        return -1;
    }

    let count = 0;
    let croakingCount = 0;
    
    let croaking = {c:0,r:1, o:2,a:3,k:4};
    let arr = new Array(5).fill(0);

    const length = croakOfFrogs.length;

    for(let i=0;i< length; i++) {
        const char = croakOfFrogs[i];
        const index = croaking[char];
        arr[index] += 1;
         
        if (index) {
            if (arr[index-1] === 0) {
                return -1;
            }
            arr[index-1] --;

            
            if (index === 4) {
                croakingCount --; 
            } 
        } else {
            croakingCount ++;
            if (croakingCount > count) {
                count = croakingCount;
            }
        }
    }

    if (croakingCount) {
        return -1;
    }

    return count;
};
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