- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址:https://leetcode-cn.com/contest/weekly-contest-185/problems/minimum-number-of-frogs-croaking/
題目描述
給你一個字符串 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’
題目大意
按順序出現的 "croak"
即爲一次青蛙叫,問給出的字符串中最少有多少個青蛙。
解題方法
字典
這個題是消消樂問題。
這個題我第一想法是保留各個青蛙的叫聲字符串,然後進行查找、匹配、消除。但這個做法會超時,因此不能全部保留青蛙的叫聲字符串。
其實我們沒有必要保留所有的字符串,只需要知道各個前綴出現的次數就行了。
對叫聲字符串進行一遍循環,根據 croak
每個字符的前面的字符是什麼,對其前面的字符進行-1,當前字符+1。
裏面有兩個特例:起始的字符"c"
不需要查找前面的字符,結束的字符"k"
不需要對當前字符+1。
舉例看下匹配的過程:
輸入: "croakcroak"
匹配的過程:
c
Counter({'c': 1})
r
Counter({'r': 1, 'c': 0})
o
Counter({'o': 1, 'c': 0, 'r': 0})
a
Counter({'a': 1, 'c': 0, 'r': 0, 'o': 0})
k
Counter({'c': 0, 'r': 0, 'o': 0, 'a': 0})
c
Counter({'c': 1, 'r': 0, 'o': 0, 'a': 0})
r
Counter({'r': 1, 'c': 0, 'o': 0, 'a': 0})
o
Counter({'o': 1, 'c': 0, 'r': 0, 'a': 0})
a
Counter({'a': 1, 'c': 0, 'r': 0, 'o': 0})
k
Counter({'c': 0, 'r': 0, 'o': 0, 'a': 0})
Python代碼如下:
class Solution:
def minNumberOfFrogs(self, croakOfFrogs: str) -> int:
count = collections.Counter()
prev = {"k" : "a", "a": "o", "o": "r", "r" : "c"}
res = 0
for c in croakOfFrogs:
if c == "c":
count[c] += 1
else:
if count[prev[c]] > 0:
if c != "k":
count[c] += 1
count[prev[c]] -= 1
else:
return -1
res = max(res, sum(count.values()))
return res if sum(count.values()) == 0 else -1
歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!
日期
2020 年 4 月 19 日 —— 近期比賽太多