题目要求
给定两个由小写字母构成的字符串 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 = "abab", B = "abab"
输出: true
示例5
输入: A = "aaaaaaabc", B = "aaaaaaacb"
输出: true
示例6
输入: A = "", B = "aa"
输出: false
题目分析
题目要求只能交换A、B字符串中的两个字母,相等的话为True,不等的话为False;
- 从示例2、3、4(A=B)中:当A、B相等时,有时为True,有时为False,可以看出为True的示例中有相同的字母,因此存在相同字母时,两者交换其实还是一样的;字母都不相同的话,无法交换即False
- 字符串A、B长度不一致时,直接False
- 当长度一致,A、B不一样时,遍历所有字母,当不一样时,将下标赋值给新的list中,新的list的长度下面分类讨论
*长度 = 2,说明有两个位置的元素不一样:若相互之间不同位置的元素一致则为True,否则为False
*长度 !=2,说明存在两个以上的元素不一致
下面将按照上述分析用Python写出详细代码:
代码
class Solution(object):
def buddyStrings(self,A,B):
a = [] # 存放不一致元素的下标
if A == B: # AB相等时,'aa'和'aa'True,'ab'和'ab'False
if len(A) == len(set(A)): # 字符串中没有相同元素时,如'ab'和'ab',则为False
return False
else: # 否则如:'aa'和'aa'、"abab"和"abab",为True
return True
if len(A) != len(B): # 长度不一样时,直接False
return False
for i in range(len(A)): # 当长度一致,字符串不相等时,如"ab"和"ba",遍历所有元素
if A[i] != B[i]:
a.append(i) # 将不一致的元素下标放入a中
if len(a) != 2: # a的长度不等于2时,说明有超过两个元素不一样,False
return False
if A[a[0]] == B[a[1]] and A[a[1]] == B[a[0]]: # a的长度为2时,相互之间不同位置的元素一致时,True
return True
else: # 不一致时,False
return False
本人小白一个,大神有更高效的算法,望留言!!!
持续更新中。。。。。