当前位置:   article > 正文

每日OJ题_算法_模拟⑤_力扣1419. 数青蛙

每日OJ题_算法_模拟⑤_力扣1419. 数青蛙

目录

力扣1419. 数青蛙

解析代码1

解析代码2


力扣1419. 数青蛙

1419. 数青蛙

难度 中等

给你一个字符串 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 <= 10^5
  • 字符串中的字符只有 'c''r''o''a' 或者 'k'

解析代码1

五个if:

  1. class Solution {
  2. public:
  3. int minNumberOfFrogs(string croakOfFrogs) {
  4. // int c = 0, r = 0, o = 0, a = 0, k = 0;
  5. vector<int> arr(6, 0); // 用下标1到5分别映射五个字母
  6. for(auto& e : croakOfFrogs)
  7. {
  8. if(e == 'c')
  9. {
  10. if(arr[5] > 0)
  11. --arr[5];
  12. ++arr[1];
  13. }
  14. if(e == 'r')
  15. {
  16. if(arr[1] > 0)
  17. --arr[1];
  18. else
  19. return -1;
  20. ++arr[2];
  21. }
  22. if(e == 'o')
  23. {
  24. if(arr[2] > 0)
  25. --arr[2];
  26. else return -1;
  27. ++arr[3];
  28. }
  29. if(e == 'a')
  30. {
  31. if(arr[3] > 0)
  32. --arr[3];
  33. else return -1;
  34. ++arr[4];
  35. }
  36. if(e == 'k')
  37. {
  38. if(arr[4] > 0)
  39. --arr[4];
  40. else return -1;
  41. ++arr[5];
  42. }
  43. }
  44. if(arr[1] > 0 || arr[5] == 0)
  45. return -1;
  46. return arr[5];
  47. }
  48. };

解析代码2

哈希表

  1. class Solution {
  2. public:
  3. int minNumberOfFrogs(string croakOfFrogs) {
  4. string str = "croak";
  5. int n = str.size();
  6. vector<int> arr(n, 0); // 数组模拟哈希表
  7. unordered_map<char, int> index; //映射每个字符的下标
  8. for(int i = 0; i < n; ++i)
  9. index[str[i]] = i;
  10. for(auto& e : croakOfFrogs)
  11. {
  12. if(e == 'c')
  13. {
  14. if(arr[n-1] != 0)
  15. --arr[n-1];
  16. ++arr[0];
  17. }
  18. else
  19. {
  20. if(arr[index[e] - 1] == 0)
  21. return -1;
  22. --arr[index[e] - 1];
  23. ++arr[index[e]];
  24. }
  25. }
  26. for(int i = 0; i < n-1; ++i)
  27. {
  28. if(arr[i] != 0)
  29. return -1;
  30. }
  31. return arr[n-1];
  32. }
  33. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/85025
推荐阅读
相关标签
  

闽ICP备14008679号