给定两个由小写字母构成的字符串 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
仅由小写字母构成。
C
bool buddyStrings(char* A, char* B)
{
int m=strlen(A);
int n=strlen(B);
if(m!=n)
{
return false;
}
int a[26]={0};
int b[26]={0};
for(int i=0;i<m;i++)
{
a[A[i]-'a']++;
b[B[i]-'a']++;
}
for(int i=0;i<26;i++)
{
if(a[i]!=b[i])
{
return false;
}
}
int flag=0;
for(int i=0;i<26;i++)
{
if(a[i]>1)
{
flag=1;
break;
}
}
int* res=(int*)malloc(sizeof(int)*m);
int k=0;
for(int i=0;i<m;i++)
{
if(A[i]!=B[i])
{
res[k++]=i;
}
}
if(k==0)
{
if(flag)
{
return true;
}
else
{
return false;
}
}
if(k==2)
{
return true;
}
return false;
}
C++
class Solution {
public:
bool buddyStrings(string A, string B)
{
int m=A.length();
int n=B.length();
if(m!=n)
{
return false;
}
int a[26]={0};
int b[26]={0};
for(int i=0;i<m;i++)
{
a[A[i]-'a']++;
b[B[i]-'a']++;
}
for(int i=0;i<26;i++)
{
if(a[i]!=b[i])
{
return false;
}
}
if(A==B)
{
for(int i=0;i<26;i++)
{
if(a[i]>1)
{
return true;
}
}
return false;
}
else
{
vector<int> temp;
for(int i=0;i<m;i++)
{
if(A[i]!=B[i])
{
temp.push_back(i);
}
}
if(temp.size()!=2)
{
return false;
}
return true;
}
}
};
python
class Solution:
def buddyStrings(self, A, B):
"""
:type A: str
:type B: str
:rtype: bool
"""
m=len(A)
n=len(B)
if m!=n:
return False;
a=[0 for i in range(26)]
b=[0 for i in range(26)]
for i in range(m):
a[ord(A[i])-ord('a')]+=1
b[ord(B[i])-ord('a')]+=1
flag=0
for i in range(26):
if a[i]!=b[i]:
return False
if a[i]>1:
flag=1
temp=[]
for i in range(m):
if A[i]!=B[i]:
temp.append(i)
if 0==len(temp):
if 1==flag:
return True
else:
return False
if 2==len(temp):
return True
return False