雙周賽124。

題目

輸入字串 s。

重複以下操作,直到 s 變成空字串為止:

  • 對於 ‘a’ 到 ‘z’ 的每個字元,若存在於 s 之中,則刪除 s 中最早出現的該字元

例如 s = “aabcbbca”,操作順序如下:

  • aabcbbca” 刪除粗體部分,變成 “abbca”
  • abbca” 刪除粗體部分,變成 “ba”
  • ba” 刪除粗體部分,變成””

求 s 執行最後一次操作之前的狀態。以上例而言,答案為 “ba”。

解法

每次操作,每種字元都會被刪掉一個。
所以出現越多次的字元可以留越久,最後被刪的字元也是出現次數最多的字元。

先統計各字元的出現次數,並維護各字元最後一次出現的位置。
找到最大的出現次數 mx_freq,並把出現 mx_freq 的字元填上所屬位置。

時間複雜度 O(N)。
空間複雜度 O(N)。

class Solution:
    def lastNonEmptyString(self, s: str) -> str:
        N = len(s)
        freq = Counter(s)
        last_idx = {c:i for i, c in enumerate(s)}
        
        ans = [""] * N
        mx_freq = max(freq.values())
        for k, v in freq.items():
            if v == mx_freq:
                idx = last_idx[k]
                ans[idx] = k
                
        return "".join(ans)