题目链接
题目:
分析:
- 题目的意思是:
一次蛙鸣是一个完整的字符串"croak", 给你一个字符串, 让你求出最少的青蛙数目
示例一: 两次完整的"croak", 可以由一只青蛙完成, 所以答案为1
示例二: 第一次蛙鸣还没有结束, 又出现了"c", 说明有第二只青蛙, 所以答案为2
示例三: 如果有无效的字符, 或蛙鸣不完整, 直接返回-1 - 我们可以借助哈希表<Character,Integer>
- 在遍历字符串时, 如果出现"r"字符, 我们要看他前面即"c" 在哈希表中是否存在, 有两种情况:
如果存在说明此时的"r"是有效字符, 将"c"对应的数量--, 将"r"对应的数量++
如果不存在, 说明"r"无效, 直接返回-1 - 同理, 出现"o""a""k", 也要找他们前面的字符在哈希表中的数量是否为0
- 那么此时, 如果有一次完整的蛙鸣, 那么在"k"对应的数量就会存储下来
- 如果出现"c", 我们要看是否有已经完成蛙鸣的青蛙(因为我们要找的是最小的数量), 这个数量是存储到"k"对应的哈希表中的, 分两种情况:
如果"k"对应的哈希表为0, 说明前面没有空闲的青蛙, 所以应该增加蛙的数量, 让"c"对应的哈希表++
如果"k"对应的哈希表不为0, 说明有空闲的青蛙, 让"k"哈希表--,"c"哈希表++即可
- 在遍历字符串时, 如果出现"r"字符, 我们要看他前面即"c" 在哈希表中是否存在, 有两种情况:
- 在实现代码时, 我们不需要真的创建哈希表, 只需要用哈希数组即可, 0下标对应"c", 1下标对应"r"...., 想要找到前一个字符的位置, 只需要用String中的index()方法找到下标, 再-1即可
代码:
class Solution {
public int minNumberOfFrogs(String croakOfFrogs) {
String str = "croak";
int n = str.length();
char[] arr = croakOfFrogs.toCharArray();
int[] hash = new int[n];
for (char x : arr) {
if (x == str.charAt(0)) {
if (hash[n - 1] != 0)
hash[n - 1]--;
hash[0]++;
} else {
int i = str.indexOf(x);
if (hash[i - 1] == 0)
return -1;
hash[i - 1]--;
hash[i]++;
}
}
for (int i = 0; i < hash.length - 1; i++) {
if (hash[i] != 0)
return -1;
}
return hash[n - 1];
}
}