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
提示:
1 <= s.length, goal.length <= 2 * 104
s
和goal
由小写英文字母组成
题解:
class Solution {
public boolean buddyStrings(String s, String goal) {
//记录goal字符串每一个字符出现的次数
int[] counts = new int[26];
//记录最多字符出现的次数,解决"aaaa","abab"等问题
int max = 0;
for (int i = 0; i < goal.length(); i++) {
counts[goal.charAt(i) - 'a']++;
max = Math.max(max,counts[goal.charAt(i) - 'a']);
}
//num记录s字符串中和goal字符串不同的字符的个数
int num = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != goal.charAt(i)) {
++num;
}
counts[s.charAt(i) - 'a']--;
}
//如果此时s和goal字符串相等,并且max超过了2,则说明能够交换两个相同字符长的位置,依旧保持不变
if (num == 0 && max >= 2) {
return true;
}
//如果不满足上述情况,此时num不为2,则直接返回false
if (num != 2) return false;
//对比此时counts数组,是否每一个字符的次数为0,即表示s和goal字符串的所有字符相同
for (int val : counts) {
if (val != 0) return false;
}
return true;
}
}