859. 亲密字符串
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。
示例 1:
输入:s = “ab”, goal = “ba”
输出:true
解释:你可以交换 s[0] = ‘a’ 和 s[1] = ‘b’ 生成 “ba”,此时 s 和 goal 相等。
示例 2:
输入:s = “ab”, goal = “ab”
输出:false
解释:你只能交换 s[0] = ‘a’ 和 s[1] = ‘b’ 生成 “ba”,此时 s 和 goal 不相等。
示例 3:
输入:s = “aa”, goal = “aa”
输出:true
解释:你可以交换 s[0] = ‘a’ 和 s[1] = ‘a’ 生成 “aa”,此时 s 和 goal 相等。
示例 4:
输入:s = “aaaaaaabc”, goal = “aaaaaaacb”
输出:true
思考
首先要满足两个字符串长度相同
情况一 两个字符串完全相同 存在两个相同的字符 true
情况二 一个字符串只有两个字符不匹配,所以可以用count来记录不同的数量,count>2直接返回false ,最后如果count==2,并且记录下来的位置相同即返回true
实现
package 力扣;
import sun.applet.Main;
import java.util.HashMap;
/**
* @author yyq
* @create 2022-02-26 13:06
*/
public class leetcode859 {
public static void main(String[] args) {
String a="abab";
String b="abab";
System.out.println(buddyStrings(a, b));
}
public static boolean buddyStrings(String s, String goal) {
boolean flag=true;
HashMap<Character,Integer> map=new HashMap<>();
if(s.length()!=goal.length()) return false;
// 情况一 a,b完全相同 存在一个字符数量大于2
if(s.equals(goal)){
for (int i = 0; i < s.length(); i++) {
if(!map.containsKey(s.charAt(i))){
map.put(s.charAt(i),1);
}else {
return true;
}
}
return false;
}
// 情况二 a,b仅有两个不相同
int count=0;
int[] index=new int[2];
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)!=goal.charAt(i)){
if(count<2){
index[count]=i;
}
count++;
if (count>2){
return false;
}
}
}
if(count!=2) return false;
if(count==2){
if(s.charAt(index[0])!=goal.charAt(index[1])||s.charAt(index[1])!=goal.charAt(index[0])){
return false;
}
}
return flag;
}
}