天天看點

【LeetCode】C++ :簡單題 - 字元串 859. 親密字元串

859. 親密字元串

難度簡單126

給定兩個由小寫字母構成的字元串 

A

 和 

B

 ,隻要我們可以通過交換 

A

 中的兩個字母得到與 

B

 相等的結果,就傳回 

true

 ;否則傳回 

false

 。

交換字母的定義是取兩個下标 

i

 和 

j

 (下标從   開始),隻要 

i!=j

 就交換 

A[i]

 和 

A[j]

 處的字元。例如,在 

"abcd"

 中交換下标   和下标 

2

 的元素可以生成 

"cbad"

 。

示例 1:

輸入: A = "ab", B = "ba"
輸出: true
解釋: 你可以交換 A[0] = 'a' 和 A[1] = 'b' 生成 "ba",此時 A 和 B 相等。      
示例 2:
輸入: A = "ab", B = "ab"
輸出: false
解釋: 你隻能交換 A[0] = 'a' 和 A[1] = 'b' 生成 "ba",此時 A 和 B 不相等。
      
示例 3:
輸入: A = "aa", B = "aa"
輸出: true
解釋: 你可以交換 A[0] = 'a' 和 A[1] = 'a' 生成 "aa",此時 A 和 B 相等。      
示例 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) {
        if(A.length() != B.length()){
            return false;
        }
        if(A == B){
            vector<int> count(26);
            for(auto ch: A){
                count[ch-'a']++;
            }
            for(auto i: count){
                if(i > 1){
                    return true;
                }
            }
            return false;
        }else{
            int first = -1, second = -1;
            for(int i = 0; i < A.length(); i++){
                if(A[i] != B[i]){
                    if(first == -1){
                        first = i;
                    }else if(second == -1){
                        second = i;
                    }else{
                        return false;
                    }
                }
            }
            return second != -1 && A[first] == B[second] && A[second] == B[first];
        }


    }
};