題目: LeetCode - 859. Buddy Strings

題目說明

給兩個 String A, BA 需要交換任意兩字元一次,求交換後的 A 是否等於 B

解題思路

先檢查兩者長度是否相等,若不相等則直接回傳 False。
接著檢查,若兩者原本就已經相等,則判斷 A 內是否有重複的字元,因為 A 一定要交換一次,若 A 中沒有重複的字元則交換後會變為不相等,這裡使用 hashset 來判斷。
最後遍歷兩者,將兩者字元不同的 index 儲存,最後判斷 diff 的大小是否為 2,若為 2 則判斷 A[diff[0]] 是否等於 B[diff[1]] 且 A[diff[1]] 是否等於 B[diff[0]] ( 此條件為檢查是否 A 元素互換後會等於 B ) 若都符合則回傳 True,否則回傳 False。

參考解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// fast IO
static auto __ = []()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution {
public:
bool buddyStrings(string A, string B)
{
if (A.length() != B.length()) return false;
if (A == B) return unordered_set<char>(A.begin(), A.end()).size() < A.length();
vector<int> diff;
for (int i = 0; i < A.length(); ++i) if (A[i] != B[i]) diff.emplace_back(i);
return diff.size() == 2 && A[diff[0]] == B[diff[1]] && A[diff[1]] == B[diff[0]];
}
};