题目
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。
解题思路
- 若字符串长度不相等,直接返回
false
。 - 若字符串相等,且有重复元素,返回
true
,否则返回false
。 - 前两项都不满足,遍历数组有且仅有两处字符不一样,如果交换后相等则返回
true
,否则返回false
。
代码
class Solution {
public boolean buddyStrings(String s, String goal) {
int lengthS = s.length(), lengthGoal = goal.length();
if (lengthS != lengthGoal) return false;
if (s.equals(goal)) {
int[] flags = new int[26];
for (int i = 0; i < lengthS; i++) {
int word = s.charAt(i) - 'a';
flags[word]++;
if (flags[word] >= 2) {
return true;
}
}
} else {
List<Integer> index = new ArrayList<>();
for (int i = 0; i < lengthS; i++) {
if (s.charAt(i) != goal.charAt(i)) {
index.add(i);
}
}
if (index.size() != 2) return false;
int index1 = index.get(0), index2 = index.get(1);
if (s.charAt(index1) == goal.charAt(index2) && s.charAt(index2) == goal.charAt(index1)) return true;
else return false;
}
return false;
}
}