題目描述:
給定兩個由小寫字母構成的字元串 A 和 B ,隻要我們可以通過交換 A 中的兩個字母得到與 B 相等的結果,就傳回 true ;否則傳回 false 。
交換字母的定義是取兩個下标 i 和 j (下标從 0 開始),隻要 i!=j 就交換 A[i] 和 A[j] 處的字元。例如,在 "abcd" 中交換下标 0 和下标 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
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/buddy-strings
解題思路及代碼:
### 解題思路
根據題意,判斷多個條件即可:
1.判斷兩個字元長度,如不同,直接傳回False;
2.一次周遊,找到不同的位置,并儲存;
3.當不同的次數為2時,比較兩個字元在不同位置下交換是否相等;
4.當不同次數為0時,隻需要判斷字元中是否有重複的字母出現即可。
### 代碼
```python
class Solution(object):
def buddyStrings(self, a, b):
"""
:type a: str
:type b: str
:rtype: bool
"""
if len(a) != len(b):
return False
same_num = []
for i in range(len(a)):
if a[i] != b[i]:
same_num.append(i)
if len(same_num) == 2:
if a[same_num[0]] == b[same_num[1]] and a[same_num[1]] == b[same_num[0]]:
return True
if len(same_num) == 0:
return len(a) > len(set(a))
return False
```