> For the complete documentation index, see [llms.txt](https://cai-sen-se.gitbook.io/leetcode/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cai-sen-se.gitbook.io/leetcode/801-1000/859.-qin-mi-zi-fu-chuan.md).

# 859.亲密字符串

<https://leetcode-cn.com/problems/buddy-strings/>

要满足三个条件：长度相同，词频相同，不同位数恰好为2（只交换两个字符）。只要有一个不满足都不符合

此外，若不同位数为0要详细讨论，如s=ab，goal=ab，这样不能交换。能交换的情况是存在某个字符的频率>=2

```python
class Solution:
    def buddyStrings(self, s: str, goal: str) -> bool:
        m, n = len(s), len(goal)
        # 长度不同直接返回
        if m != n:
            return False
        cntS, cntG = [0]*26, [0]*26	#表示字母a-z的词频
        diff = 0	# 不同的位数
        # 统计词频
        for a,b in zip(s, goal):
            cntS[ord(a) - ord('a')] += 1
            cntG[ord(b) - ord('a')] += 1
            if a != b:
                diff += 1
        for i in range(26):
            if cntS[i] != cntG[i]:	#某个字母词频不同直接返回
                return False
        # 此时长度和词频都一样
        if diff == 0:	# 特殊情况，看有无频率>=2的字符
            for i in range(26):
                if cntS[i] >= 2:
                    return True
            return False
        # 只有不同位数为2才符合，其余都不符
        if diff == 2:
            return True
        return False
```
