class Solution {
public boolean buddyStrings(String s, String goal) {
if(s.length()!=goal.length()){
return false;
}
int sum = 0;
int[] p1 = new int[26];
int[] p2 = new int[26];
for(int i = 0;i<s.length();i++){
int a = s.charAt(i)-'a';
int b = goal.charAt(i)-'a';
p1[a]++;
p2[b]++;
if(a!=b){
sum++;
}
}
boolean bol = false;
for(int i = 0;i<26;i++){
if(p1[i]!=p2[i]){
return false;
}
if(p1[i]>1){
bol = true;
}
}
return sum==2 || (sum==0 & bol);
}
}
简单的字符串模拟,首先我们要保证两个字符串的长度是相等的,要不然不可能是亲密字符串,接着我们要保证不同的地方是2处,或者没有不同的地方,但是如果没有不同的情况,就要再进入一个条件,即aa和aa是亲密字符串,但是ab和ab不是,因为第一个a可以和第二个a换地方,而ab不可以。
想明白上面这几点,我们就可以顺着思路想下去了,即两个亲密字符串,字母的种类和个数都是相同的,仅仅是放置的位置不一样,且是两处不一样,我们就可以设置一个哈希表来记录两个字符串中的每个字母出现的次数,然后再比是不是每个出现的次数都相同就可以了,因为是两处不同,并且次数都相同,说明换个地就都一样了。
代码如上。