雙周賽107。這次周賽又被DDOS,大概卡了快一小時才恢復正常。

題目

輸入由不同字串組成的陣列words。

若滿足條件,words[i]可以和words[j]組成一對:

  • words[i]等於反轉後的words[j]
  • 0 <= i < j < words.length

求words中最多可以組成幾對字串。

注意:每個字串只能被配對一次。

解法

題目保證words中每個字串都是獨一無二的,最多也只會有一種配對方式,不用考慮重複配對的狀況。
直接窮舉所有組合(i,j),如果滿足條件則答案+1。

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

class Solution:
    def maximumNumberOfStringPairs(self, words: List[str]) -> int:
        N=len(words)
        ans=0
        
        for j in range(N):
            for i in range(j):
                if words[i]==words[j][::-1]:
                    ans+=1
                    break
                    
        return ans

既然知道每個字串只有一種配對可能,直接用雜湊表seen紀錄出現過的字串就好。
遍歷字串w時檢查反轉過的w有沒有出現過,有的話答案+1;否則把w加到seen中。

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

class Solution:
    def maximumNumberOfStringPairs(self, words: List[str]) -> int:
        seen=set()
        ans=0
        
        for w in words:
            rev=w[::-1]
            if rev in seen:
                # seen.remove(rev)
                ans+=1
            else:
                seen.add(w)
                
        return ans