周賽310。這題其實直覺秒殺,比Q1還簡單。

題目

輸入字串s,將該字串劃分為一個或多個子字串,使得每個子符串中每個字元最多出現1次。
求最少需要幾個子字串。

注意,每個字元都要被分到某個子字串中。

解法

子字串一定是連續的,那我們只要依序記錄那些字元已經出現過就好。

s長度至少1,代表子字串最少要有一個,ans初始化為1。
遍歷每個字元c,若c已經出現過則建立新的子字串,ans+1,並把集合清空。最後將c加入集合,表示已經出現過。
時間複雜度O(N),而字元只會出現a~z,實際上是常數,空間複雜度O(1)。

class Solution:
    def partitionString(self, s: str) -> int:
        seen=set()
        ans=1
        
        for c in s:
            if c in seen:
                seen=set()
                ans+=1
            seen.add(c)
        
        return ans
                

也可以用bitmask來表示各字母的出現狀態,雖然執行起來反而變慢。

class Solution:
    def partitionString(self, s: str) -> int:
        ans=1
        mask=0
        
        for c in s:
            i=ord(c)-97
            if mask&(1<<i):
                mask=0
                ans+=1
            mask|=(1<<i)
            
        return ans