题干
给你一个字符串 croakOfFrogs
,它表示不同青蛙发出的蛙鸣声(字符串 "croak"
)的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs
中会混合多个 “croak”
。
请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’
这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs
不是由若干有效的 “croak” 字符混合而成,请返回 -1
。
示例 1:
**输入:**croakOfFrogs = “croakcroak”
**输出:**1
**解释:**一只青蛙 “呱呱” 两次
示例 2:
输入:croakOfFrogs = “crcoakroak”
输出:2
解释:最少需要两只青蛙,“呱呱” 声用黑体标注
第一只青蛙 "crcoakroak"
第二只青蛙 "crcoakroak"
题解
crock 对应的数组int[5]
的空格中,分别是0,1,2,3,4 当c出现的时候,说明有一只青蛙在空格0中。当r出现的时候,需要青蛙从0跳到1 。 然后当k出现的时候,青蛙要结束本身的生命周期。因为之后再有声音c出现的时候,可以和结束生命周期的青蛙,认定为同一只
结算的话,出现c,就表示多一只青蛙出现,出现k,表示少一直青蛙出现
public int minNumberOfFrogs(String croakOfFrogs) {
char[] arr = croakOfFrogs.toCharArray();
HashMap<Character, Integer> map = new HashMap<>();
map.put('c', 0);
map.put('r', 1);
map.put('o', 2);
map.put('a', 3);
map.put('k', 4);
int[] dp = new int[5];
int res = 0;
int flogNum = 0;
for (int i = 0; i < arr.length; i++) {
char c = arr[i];
Integer index = map.get(c);
if (index != 4 && index != 0) {
if (dp[index - 1] == 0) {
return -1;
}
dp[index - 1]--;
dp[index]++;
} else if (index == 0) {
flogNum++;
dp[0]++;
} else if (index == 4) {
// 需要结算
dp[3]--;
res = Math.max(res, flogNum);
flogNum--;
}
}
if (flogNum > 0) {
return -1;
}
return res;
}
总结
这样的题目最难分析了。
最新华为OD机试
题目描述
一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。
具体的:
1.大雁发出的完整叫声为”quack“,因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个”quack”。
2.大雁会依次完整发出”quack”,即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。
3.如果字符串不是由’q’, ‘u’, ‘a’, ‘c’, ‘k’ 字符组合而成,或者没有找到一只大雁,请返回-1。
求大雁的数量