周賽341。

題目

輸入陣列word,你可以在任意位置插入字元”a”, “b”或”c”任意次。求最少需要插入幾次才能使word合法

如果一個字串由任意個字串”abc”所組成,則稱其為合法

解法

反正只能插入不能刪除,就找那些位置需要插入就行。

合法word必須是以”abc”模式循環而成,用一個索引變數i紀錄當前應該要找”abc”中哪個位置。
遍歷word中每個字元,若是當前應該要找的,則代表需要插入,答案加1。

記得要檢查最後的abc有沒有找完:

例如word = “a”
遍歷完word後,i=1
應當補上”bc”

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

class Solution:
    def addMinimum(self, word: str) -> int:
        pat="abc"
        i=0
        ans=0
        
        for c in word:
            while pat[i]!=c:
                i=(i+1)%3
                ans+=1
            i=(i+1)%3

        # equals to 
        # ans+(3-i)%3
        while i>0:
            i=(i+1)%3
            ans+=1
            
        return ans

補一個搞笑方法,每次replace和count應該是O(N + M),其中N為word長度,M為”abc”長度,也就是3。
複雜度應該是O(N)。

class Solution:
    def addMinimum(self, word: str) -> int:
        ans=0
        
        word=word.replace("abc","")
        
        for pat in ["ab","ac","bc"]:
            ans+=word.count(pat)
            word=word.replace(pat,"")
            
        for pat in "abc":
            ans+=word.count(pat)*2
            word=word.replace(pat,"")
        
        return ans