↓快轉到主要內容
  1. LeetCode/

LeetCode 859: Buddy Strings

·1 分鐘· ·
LeetCode Easy Hash-Table String
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-09-17

  • 提交紀錄:Runtime Error ×2 → Wrong Answer ×3 → Accepted ×3

解題思路
#

分三種情況:

  1. 長度不同:不可能。
  2. s == goal:必須交換兩個相同的字元,所以 s 要有重複字元(len(set(s)) < len(s))。
  3. 其他:找出所有不同的位置,必須剛好兩個 i, j,而且 s[i] == goal[j]、s[j] == goal[i]。

我的嘗試
#

這題提交了 8 次,每次補一種情況:

  • 前兩版是變數問題:計數器在設定 d1、d2 之前就加一,d1 永遠沒被設定(NameError)。
  • 第三版沒處理兩個字串相同的情況:"c"、"c" 必須交換一次,沒有重複字元就做不到,答案 False,回傳 True。
  • 補上之後,只有一個位置不同時也回傳 True:"a"、"c"。最後加上「不同的位置剛好一個就失敗」才 AC。

正確解法
#

class Solution:
    def buddyStrings(self, s: str, goal: str) -> bool:
        if len(s) != len(goal):
            return False
        if s == goal:
            return len(set(s)) < len(s)
        diff = [i for i in range(len(s)) if s[i] != goal[i]]
        return len(diff) == 2 and s[diff[0]] == goal[diff[1]] and s[diff[1]] == goal[diff[0]]

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 一定要交換一次:相同的字串只有在有重複字元時才成立。
  • 只有一個位置不同時,交換不可能修好。

面試口說整理
#

我先排除長度不同;兩個字串相同時要有重複字元才能交換;否則找出不同的位置,必須剛好兩個而且交叉相等。時間 O(n)。

相關文章

LeetCode 819: Most Common Word
·1 分鐘
LeetCode Easy Array Hash-Table String Counting
LeetCode 819 解題筆記:標點換成空白、全部轉小寫再切單字,計數後找出不在 banned 裡的最多的那個
LeetCode 771: Jewels and Stones
·1 分鐘
LeetCode Easy Hash-Table String
LeetCode 771 解題筆記:把 jewels 放進集合,數 stones 裡有幾個字元在集合裡
LeetCode 748: Shortest Completing Word
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 748 解題筆記:車牌只看字母並轉小寫計數,找出每個字母次數都夠的最短單字,同長度取最前面的
LeetCode 599: Minimum Index Sum of Two Lists
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 599 解題筆記:把 list1 的字串對應到 index,掃 list2 時算兩邊 index 的和,留下和最小的全部字串
LeetCode 290: Word Pattern
·1 分鐘
LeetCode Easy Hash-Table String
LeetCode 290 解題筆記:pattern 的字元和單字要一對一對應,用兩個方向的 dict 或比較 set 大小
LeetCode 383: Ransom Note
·1 分鐘
LeetCode Easy Hash-Table String Counting
LeetCode 383 解題筆記:ransomNote 每個字元的需求數量都不能超過 magazine 的數量;Counter 相減為空就成立