问题描述:
给定两个由小写字母构成的字符串 A
和 B
,只要我们可以通过交换 A
中的两个字母得到与 B
相等的结果,就返回 true
;否则返回 false
。
示例 1:
输入: A = "ab", B = "ba" 输出: true
示例 2:
输入: A = "ab", B = "ab" 输出: false
示例 3:
输入: A = "aa", B = "aa" 输出: true
示例 4:
输入: A = "aaaaaaabc", B = "aaaaaaacb" 输出: true
示例 5:
输入: A = "", B = "aa" 输出: false
提示:
0 <= A.length <= 20000
0 <= B.length <= 20000
A
和B
仅由小写字母构成。
问题分析:
这个题目不难,但要理解透,就是字符串A中的两个字符必须进行一次交换之后和字符串B相同。所以可以分情况讨论。
(1)两个字符串长度不同,直接返回false,len(A)==len(B)是亲密字符串的前提条件。
(2)当 A==B,字符串A中必须存在重复字符,否则无法完成一次交换,也就成不了亲密字符串。
(3)当 A != B, 此时要想成立,字符串A、B对应位置有两位不一样,且,交换之后一样。
Python3实现:
class Solution:
def buddyStrings(self, A, B):
if len(A) != len(B): return False # 长度不相等的情况
if A == B: # 两个字符串相等的情况,A必须存在重复字符
seen = set()
for a in A:
if a in seen: return True
seen.add(a)
return False
else:
pairs = []
for a, b in zip(A, B): # A、B不相等的情况
if a != b:
pairs.append([a, b])
if len(pairs) > 2: return False
return len(pairs) == 2 and pairs[0] == pairs[1][::-1]
if __name__ == '__main__':
solu = Solution()
print(solu.buddyStrings(A='ab', B='ba'))
欢迎指正哦