描述
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。
分析
满足“亲密字符串”的情况有两种:
- 两条字符串相同且有字符出现两次。
- 两条字符串不同的字符只有两处且通过交换位置变得一致。
class Solution {
public boolean buddyStrings(String s, String goal) {
//排除掉长度不一致的情况
if(s.length() != goal.length() || s.length() < 2){
return false;
}
//借助set判断两条字符串相同时,是否有字符出现两次。
Set<Character> set = new HashSet<>();
if(s.equals(goal)){
for(int i = 0; i < s.length(); i++){
set.add(s.charAt(i));
}
if(set.size() < s.length()){
return true;
}
return false;
}
//借助list判断两条字符串不同的字符有几处,若为2处,交换位置字符串是否变得相等。
List<Integer> list = new ArrayList<>();
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) != goal.charAt(i)){
list.add(i);
}
}
if(list.size() != 2){
return false;
}
return s.charAt(list.get(0)) == goal.charAt(list.get(1)) && s.charAt(list.get(1)) == goal.charAt(list.get(0));
}
}