1. 程式人生 > >Leetcode859.Buddy Strings親密字串

Leetcode859.Buddy Strings親密字串

給定兩個由小寫字母構成的字串 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

提示:

  1. 0 <= A.length <= 20000
  2. 0 <= B.length <= 20000
  3. 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;
        }
    }
};