【LeetCode-字串】親密字串
阿新 • • 發佈:2020-08-12
題目描述
給定兩個由小寫字母構成的字串 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)