给定两个由小写字母构成的字符串 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
思路:
一开始,直接判断A和B的长度是否一样,如果不一样,则直接返回false
建立一个数组vector<int> temp存放A中和B中不一样的下标,对A和B中的字符进行遍历,如果对应字符不一样,则把对应的下标存到数组中,并且判断数组的长度是否大于2,如果大于2,则直接返回false,因为3个或一上的字符不一样,则无法通过交换2个字符使字符串A和B一样,如果不大于2,则继续遍历
遍历完后,数组的长度有3种情况:
情况1:长度为1,返回false
情况2:长度为2:那么判断(A中的前一个字符和B中的后一个字符)和(A中后一个字符和B中前一个字符)是否同时一样,如果同时一样,则返回true,否则,返回false
情况3:长度为0,这时候要注意,不能直接返回true,因为可能出现下面的情况,如A是“ab”,B也是“ab”,那么一交换A和B就不一样了,可以总结一下这种情况,当A中有字符重复2次时,可以通过交换使A和B一样,当A中所有字符出现一次时,无法通过交换使A和B一样。那怎么办?我们用一个map<char,int> t存A中所有字符出现的次数,对A进行遍历,每出现一个字符,我map中对应的int就++,如果再判断是否超过2,如果超过,则返回true,如果不超过,则继续,当遍历完还没有返回true时,证明A中所有字符都只出现了一次,那么就返回false了
代码:
class Solution {
public:
bool buddyStrings(string A, string B) {
if(A.length()!=B.length()) //判断AB长度是否相等
return 0;
vector<int> temp;
for(int i=0;i<A.length();i++) //选出A和B中不一样字符的下标存在数组中
{
if(A[i]!=B[i])
{
temp.push_back(i);
if(temp.size()>2)
return 0;
}
}
if(temp.size()==0) //数组长度为0的情况
{
map<char,int> t;
for(int i=0;i<A.length();i++)
{
t[A[i]]++;
if(t[A[i]]>=2)
return 1;
}
return 0;
}
if(temp.size()!=2) //数组长度为1的情况
return 0;
else //数组长度为2的情况
{
if(A[temp[0]]==B[temp[1]] && A[temp[1]]==B[temp[0]])
return 1;
else
return 0;
}
}
};