解题思路:
大的分类分为三种情形:
(1)两个字符串长度不相等,结果肯定为false
(2)两个字符串长度相等,但是字符串长度小于2,结果为false
(3)字符串长度相等且其长度大于等于2,又分为以下几种情况:
声明一个计数器变量cnt,两个记录索引位置的变量:index1和index2。遍历字符串,只要两个字符串中的字符不等,计数器就加1,index1记录字符串中第一次出现字符不等的位置,index2记录两个字符串中第二次出现字符不等的位置。
①若cnt>2,则表示不能只通过交换一次字母达到两个字符串相等的目的,所以最终返回false
②cnt为1,同样不能通过交换一次字母达到两个字符串相等的目的,返回false
③cnt=0,查看字符串中是否出现重复的字母,如果有字母出现不止一次,则可以通过交换一次字母使得两字符串相等。声明一个map类型的变量,遍历字符串,如果当前字符串中的字符已经在map中出现过,则返回true,反之将其存到map中,若字符串遍历结束,map中无重复字符,则返回false
④cnt=2,如果A[index1]!=B[index2]或B[index1]!=A[index2],则返回false,其他情况返回true
class Solution {
public boolean buddyStrings(String A, String B) {
int len1=A.length();
int len2=B.length();
if(len1!=len2){
return false;
}
if(len1<2){
return false;
}
int cnt=0;
int index1=0,index2=0;
for(int i=0;i<len1;++i){
if(A.charAt(i)!=B.charAt(i)){
cnt++;
if(cnt>2){
return false;
}
if(cnt==1){
index1=i;
}
else{
index2=i;
}
}
}
if(cnt==1){
return false;
}
Map<String,Integer> map=new HashMap<String,Integer>();
if(cnt==0){
for(int i=0;i<len1;++i){
String temp=A.substring(i,i+1);
if(map.containsKey(temp)){
return true;
}
map.put(temp,i);
}
return false;
}
//cnt=2
if(A.charAt(index1)!=B.charAt(index2)||B.charAt(index1)!=A.charAt(index2)){
return false;
}
return true;
}
}