一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。
具体的:
1.大雁发出的完整叫声为”quack“,因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个”quack”。
2.大雁会依次完整发出”quack”,即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数(这句话就是和数青蛙的区别)。
3.如果字符串不是由’q’, ‘u’, ‘a’, ‘c’, ‘k’ 字符组合而成,或者没有找到一只大雁,请返回-1。
4.一个字符串,包含大雁quack的叫声。1 <= 字符串长度 <= 1000
| 输入 | 输出 |
|---|---|
| quackquack | 1 |
| qaauucqckk | -1 |
| quacqkuac | 1 |
| qququaauqccauqkkcauqqkcauuqkcaaukccakkck | 5 |
| quacqkquack | 1 |
| kaukkkqkcqukckqcqkcaqquckccaqauckuuakcuakacaccquqaaqucquk | 2 |
| qququaauqccauqkkcauqqkcauuqkcaaukccakkck | 5 |
| qkkukqkqqaqqkuacauqccakkcuuacuuqccqqkkcucqcaqqckcuaaqkcaacukuucqqaaqkcuuuaukuquucuaackcaqacckakckkcaqkkqkaqckkakucaucucuackauaukuqckkqqquucqqqqkaqkcckaukccuukqccukackaaaqqkqckauququkkkcuqaukccukkkcqakqqucckccqucaqkkkcququcaquqckqkquauqkqqkkcacqkcqcaqcckaquackkkuucuauqqckcqqqukqkccqkakaukqaqcqaqkuaakukqqucuauuckqquqqkqcakcqukccqkuuauaqkqkuuqaquauacaukckkcaquqakuaaqukackaccauuqkquaccakccckckuccqauaqqqakqcuckkucuckaqqqqquuckkaccacucaacaauquaaukkquacakqkauccucqaakcacaucqcucuckukqakquaqucackacukkquucukukkkkcuqucckcuaquuakuukuckackaqqauaauqccucqaaaaqqkquaaqukqakaaccuqukaaqqauauqkuqckcaqakkuukqkquauqcucqacqqauuuukcauukcuuckckqkcaucuuuckqauukqkackucuaqkukqckucckuqqakcuquqaucqqauuquaaukkaaaaaqquuaqkuckuuaacuaccuaqaaakuaacqqcaaqauqqucaukkkccquacacckuaaaaauuuqcukqakakkkuqaqaqaakucckuakqqcaqucuqqaqkaakqqcqquqauccquaakuukccuaqcacckcquucuakkquakqaqucaaaaqckuucqqcqckkqaauuqukkkuuucaaucaaqkaqqqccquqkuaqkcacqqqucccckcqquauakqkqucaakukcuqckcqakaaauquckqauukqaukauqaaqakcukckuckakacackkucaqckcakckuakqucuu | 19 |
class Solution {
public int minNumberOfGeese(String s) {
char[] quacks = s.toCharArray();
int count = 0;
while (find(quacks)) {
count++;
}
// 如果没有找到一只大雁返回-1。
return count == 0 ? -1 : count;
}
public boolean find(char[] arr) {
// 是否有完整找到至少一个quack
boolean isFind = false;
// indexes存q u a c k在原数组中对应的下标
int[] indexes = new int[5];
// 下一个应该要找的字母
char nextNeed = 'q';
// 遍历原数组
for (int i = 0; i < arr.length; i++) {
// 如果存在0, 说明进入过下面第5个分支(当arr[i]==k && nextNeed=='k'时), 直接跳过
if (arr[i] == 0) continue;
// 如果遍历到q, 并且正好需要q, 则更新下一个需要的字母为u, 并记录下q的下标
if (arr[i] == 'q' && nextNeed == 'q') {
nextNeed = 'u';
indexes[0] = i;
}
// 如果遍历到u, 并且正好需要u, 则更新下一个需要的字母为a, 并记录下u的下标
else if (arr[i] == 'u' && nextNeed == 'u') {
nextNeed = 'a';
indexes[1] = i;
}
// 如果遍历到a, 并且正好需要a, 则更新下一个需要的字母为c, 并记录下a的下标
else if (arr[i] == 'a' && nextNeed == 'a') {
nextNeed = 'c';
indexes[2] = i;
}
// 如果遍历到c, 并且正好需要c, 则更新下一个需要的字母为k, 并记录下c的下标
else if (arr[i] == 'c' && nextNeed == 'c') {
nextNeed = 'k';
indexes[3] = i;
}
// 如果遍历到k, 并且正好需要k, 则更新下一个需要的字母为q, 并记录下k的下标
// 说明此时已经找到quack5个字母了, 将原数组的对应下标全部更新为0, 并更新isFind为true
else if (arr[i] == 'k' && nextNeed == 'k') {
nextNeed = 'q';
indexes[4] = i;
for (int index : indexes) arr[index] = 0;
isFind = true;
}
}
return isFind;
}
}