給你一個字符串 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" 的有效組合。
示例 4:
輸入:croakOfFrogs = "croakcroa"
輸出:-1
提示:
1 <= croakOfFrogs.length <= 10^5
字符串中的字符只有 'c', 'r', 'o', 'a' 或者 'k'
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-number-of-frogs-croaking
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
題解:該題可以借鑑 “有效的括號” 的思路,遇到 r 的時候要保證 c 的數量 >= r 的數量,遇到 o 的時候要保證 c 的數量 & r 的數量 >= o 的數量…… 直到遇到 k ,此時要保證 c、r、o、a的數量要 > 0 ; 此期間 c 數量的最大值即爲ans
class Solution {
public:
int minNumberOfFrogs(string str) {
int len = str.length();
if(len%5 || !len) return -1;
int c=0,r=0,o=0,a=0,k=0,ans=0;
for(int i=0;i<len;i++){
if(str[i]=='c') c++;
else if(str[i]=='r'){
r++;
if(c<r) return -1;
}
else if(str[i]=='o'){
o++;
if(c<o || r<o) return -1;
}
else if(str[i]=='a'){
a++;
if(c<a || r<a || o<a) return -1;
}
else{
if(!c) return -1; else c--;
if(!r) return -1; else r--;
if(!o) return -1; else o--;
if(!a) return -1; else a--;
}
ans=max(ans,c);
}
return ans;
}
};