Leetcode # 859. Buddy Strings
- 2023.07.24
- LeetCode
https://leetcode.com/problems/buddy-strings
Solution
交換兩個 character 後 s 和 gaol 會一樣 ⇒ 回傳 True
- s 和 goal 只有在 i, j 的兩個 character 不一樣 (s[i] != goal[i] and s[j] != goal [j]),
且 s[i] = goal[j], s[j] = goal[i], i != j ⇒ 回傳 True- len(s) != len(goal) ⇒ 回傳 False
- ∃ i, j s.t. s[i] != goal[i] and s[j] != goal[j] and s[i] == s[j] ⇒ 回傳 False
例:”aa”, “bc” - s 和 goal 不一樣的 character 多於兩個
- s[i] != goal[i] and s[j] != goal [j] 但 s[i] != goal[i]
- s == goal, ∃ c ∈ [a-z] and s.count(c) >= 2 ⇒ 回傳 True
例:”aa” → “aa“
Time Complexity: O(len(s))
Space Complexity: O(1) = O(26) (s and goal only consist of lowercase letters.)
(The input and output generally do not count towards the space complexity.)
class Solution:
def buddyStrings(self, s: str, goal: str) -> bool:
if len(s) != len(goal): # Case 1-1: "a", "abc" - False
return False
diff = {}
c_counter = collections.Counter()
for i in range(len(s)):
c_counter[s[i]] += 1
if s[i] != goal[i]:
if s[i] in diff: # Case 1-2: "aa", "bc" - False
return False
diff[s[i]] = goal[i]
match len(diff):
case 3: # Case 1-3: "abc", "cab" - False
return False
case 2:
# Case 1-4: "ab", "bc" - False
if goal[i] not in diff or diff[goal[i]] != s[i]:
return False
# Case 1: "abcba", "acbba" - True
# Case 2: "aaa", "aaa" - True
return len(diff) == 2 or \
(len(diff) == 0 and \
any(c_counter[c] >= 2 for c in c_counter))
Last Updated on 2023/08/16 by A1go