1. 程式人生 > 實用技巧 >【LeetCode-字串】親密字串

【LeetCode-字串】親密字串

題目描述

給定兩個由小寫字母構成的字串 A 和 B ,只要我們可以通過交換 A 中的兩個字母得到與 B 相等的結果,就返回 true ;否則返回 false 。
示例:

輸入: A = "ab", B = "ba"
輸出: true

輸入: A = "ab", B = "ab"
輸出: false

輸入: A = "aa", B = "aa"
輸出: true

題目連結: https://leetcode-cn.com/problems/buddy-strings/

思路

遍歷字串 A,記錄 A 和 B 字元不相同的位置(下標),將下標放進陣列 index 中。因為只交換兩個字母,所以 index 的長度要為 2 或者為 0.

  • index.size()==2:
    判斷 A[index[0]] 和 B[index[1]] 是否相等以及 A[index[1]] 和 B[index[0]] 是否相等。如果相等返回 true;
  • index.size()==0:
    說明 A 和 B 是相同的字串。在示例中,"ab" 和 "ab" 返回 false,而 "aa" 和 "aa" 返回 true。所以,我們判斷字串 A 中有沒有重複的字元,有的話返回 true。
  • 其餘情況返回 false。

程式碼如下:

class Solution {
public:
    bool buddyStrings(string A, string B) {
        if(A.size()!=B.size()) return false;

        vector<int> index;
        for(int i=0; i<A.size(); i++){
            if(A[i]!=B[i]) index.push_back(i);
        }
        if(index.size()==2 && A[index[0]]==B[index[1]] && A[index[1]]==B[index[0]]) return true;
        if(index.size()==0){
            unordered_set<char> s;
            for(int i=0; i<A.size(); i++){
                if(s.count(A[i])!=0) return true;
                else s.insert(A[i]);
            }
        }
        return false;
    }
};
  • 時間複雜度:O(n)
  • 空間複雜度:O(n)