周賽348。賽中是medium,賽後就改成easy。
測資改大一點或許可以勉強放在Q2?

題目

輸入字串s,你可以執行以下動作任意次:

  • 選擇一個索引i,令字元c為s[i]
  • 如果i的左方也存在字元c,則刪除最靠近i的一個
  • 如果i的右方也存在字元c,則刪除最靠近i的一個

你的目標是將s的長度最小化

求數次動作後s的最小長度。

解法

假設某個字元c出現了三次以上,你可以:

  • 選擇中間的作為i,並刪除兩個c
  • 選擇最前或最後的作為i,刪除一個c

不管透過哪個方法,最後都可以刪到只剩下一個c。
因此答案就是s中不同的字元數量。

時間複雜度O(N)。
s只由小寫字母組成,空間複雜度O(1)。

class Solution:
    def minimizedStringLength(self, s: str) -> int:
        return len(set(s))

或是使用bitmask紀錄出現過的字母。

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

class Solution:
    def minimizedStringLength(self, s: str) -> int:
        mask=0
        
        for c in s:
            i=ord(c)-97
            mask|=(1<<i)
            
        return mask.bit_count()