Leetcode859.Buddy Strings親密字串
阿新 • • 發佈:2018-12-20
給定兩個由小寫字母構成的字串 A 和 B ,只要我們可以通過交換 A 中的兩個字母得到與 B 相等的結果,就返回 true ;否則返回 false 。
示例 1:
輸入: A = "ab", B = "ba" 輸出: true
示例 2:
輸入: A = "ab", B = "ab" 輸出: false
示例 3:
輸入: A = "aa", B = "aa" 輸出: true
示例 4:
輸入: A = "aaaaaaabc", B = "aaaaaaacb" 輸出: true
示例 5:
輸入: A = "", B = "aa" 輸出: false
提示:
- 0 <= A.length <= 20000
- 0 <= B.length <= 20000
- A 和 B 僅由小寫字母構成。
暴力法超時:
class Solution { public: bool buddyStrings(string A, string B) { int len1 = A.size(); int len2 = B.size(); if(len1 <= 1 || len2 <= 1 || len1 != len2) return false; for(int i = 0; i < len1; i++) { for(int j = i + 1; j < len1; j++) { swap(A[i], A[j]); if(A == B) return true; else swap(A[i], A[j]); } } return false; } };
官方題解:
方法:情況列舉
思路
如果 A[i] == B[i],我們就說 i 是匹配的,否則稱 i 是不匹配的。親密字串幾乎是完全匹配的,因為一次交換隻會影響到兩個索引。
如果交換 A[i] 和 A[j] 可以證明 A 和 B 是親密字串,那麼就有 A[i] == B[j] 以及 A[j] == B[i]。 這意味著在 A[i], A[j], B[i], B[j] 這四個自由變數中,只存在兩種情況:A[i] == A[j] 或 A[i] != A[j]
演算法
讓我們來看看這些情況。
在 A[i] == A[j] == B[i] == B[j] 的情況下,字串 A 與 B 相等。因此,如果 A == B,我們應當檢查每個索引 i 以尋找具有相同值的兩個匹配。
在 A[i] == B[j], A[j] == B[i], (A[i] != A[j]) 的情況下,其餘索引是相匹配的。所以如果 A 和 B 只有兩個不匹配的索引(記作 i 和 j),我們應該檢查並確保等式 A[i] == B[j] 和 A[j] == B[i] 成立。
class Solution {
public:
bool buddyStrings(string A, string B) {
int len1 = A.size();
int len2 = B.size();
if(len1 != len2 || len1 <= 1 || len2 <= 1)
return false;
if(A == B)
{
map<char, int> check;
for(int i = 0; i < len1; i++)
check[A[i]]++;
for(map<char, int> :: iterator itr = check.begin(); itr != check.end(); itr++)
{
if(itr ->second >= 2)
return true;
}
return false;
}
else
{
int first = -1;
int second = -1;
for(int i = 0; i < len1; i++)
{
if(A[i] != B[i])
{
if(first == -1)
{
first = i;
}
else if(second == -1)
{
second = i;
}
else
return false;
}
}
if(first != -1 && second != -1 && A[first] == B[second] && A[second] == B[first])
return true;
else
return false;
}
}
};