1、题目描述
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
2、算法分析
分为以下几种情况:
①如果s.length() != goal.length() 长度不相等,返回false;
②去除s = "ab", goal = "ab"这种情况。条件是:s 和 goal的长度相等,并且s中没有重复的值。
③遍历s字符串,比较s字符串和goal字符串,遇到不相等的,标记下indexi下标。遇到不相等的,要记录下不相等的次数,time次数为2的时候再不相等也就是第三次,那就返回false;time == 1的时候,说明下一次是第二次不相等,记录下index;time == 0的时候,说明下一次是第一次不相等,并记录下index;
⑤关键来了。s和goal的相对位置的字符相等,返回true;
if(s.charAt(first) == goal.charAt(second) && s.charAt(second) == goal.charAt(first)){ return true; }
具体看代码:
3、代码实现
import java.util.*;
class Solution {
public boolean buddyStrings(String s, String goal) {
if(s.length() != goal.length()){
return false;
}
Set<Character> set = new HashSet<>();
for(int i = 0;i < s.length();i++){
set.add(s.charAt(i));
}
// 针对的是s = "ab" , goal == "ab"
if(s.equals(goal) && s.length() == set.size()){
return false;
}
// 记录不等的次数
int time = 0;
// 标记下标第二次不相等的下标
int second = 0;
// 标记下标第一次不相等的下标
int first = 0;
for(int i = 0;i < s.length();i++){
if(s.charAt(i) != goal.charAt(i)){
if(time == 2){
return false;
}
if(time == 1){
second = i;
}
if(time == 0){
first = i;
}
// 每次不相等的时候记得time++
time++;
}
}
// 若s == "aa" goal == "aa",那么返回的是true
if(s.charAt(first) == goal.charAt(second) && s.charAt(second) == goal.charAt(first)){
return true;
}
return false;
}
}