【LeetCode】1419. 數青蛙 Minimum Number of Frogs Croaking (Python)


題目地址: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. 1 <= croakOfFrogs.length <= 10^5
  2. 字符串中的字符只有 ‘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 日 —— 近期比賽太多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章