天天看點

Leetcode刷題之:859親密字元串

題目描述:

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

送出結果:

Leetcode刷題之:859親密字元串