原题链接:使字符串不同字符的数目相等
给你两个下标从 0 开始的字符串 word1 和 word2 。
一次 移动 由以下两个步骤组成:
-
选中两个下标 i 和 j ,分别满足 0 <= i < word1.length 和 0 <= j < word2.length ,
-
交换 word1[i] 和 word2[j] 。
如果可以通过 恰好一次 移动,使 word1 和 word2 中不同字符的数目相等,则返回 true ;否则,返回 false 。
示例 1:
输入:word1 = “ac”, word2 = “b”
输出:false
解释:交换任何一组下标都会导致第一个字符串中有 2 个不同的字符,而在第二个字符串中只有 1 个不同字符。
示例 2:
输入:word1 = “abcc”, word2 = “aab”
输出:true
解释:交换第一个字符串的下标 2 和第二个字符串的下标 0 。之后得到 word1 = “abac” 和 word2 = “cab” ,各有 3 个不同字符。
示例 3:
输入:word1 = “abcde”, word2 = “fghij”
输出:true
解释:无论交换哪一组下标,两个字符串中都会有 5 个不同字符。
提示:
-
1 <= word1.length, word2.length <= 105
-
word1 和 word2 仅由小写英文字母组成。
public static boolean isItPossible(String word1, String word2) {
int[] cnt1=new int[26];
for (int i = 0; i < word1.length(); i++) {
cnt1[word1.charAt(i)-'a']++;
}
int[] cnt2=new int[26];
for (int i = 0; i < word2.length(); i++) {
cnt2[word2.charAt(i)-'a']++;
}
int num1=0,num2=0;
for (int i=0;i<26;i++){
num1+=cnt1[i]==0?0:1;
num2+=cnt2[i]==0?0:1;
}
for (int i=0;i<26;i++){
if (cnt1[i]==0) continue;
for (int j=0;j<26;j++){
if (cnt2[j]==0) continue;
if (i==j){
if (num1==num2){
return true;//如果word1和word2的字符种类相等 且 存在相同字符的话,直接交换这两个相同的字符,交换之后字符种类还是相等的。这就满足题意,恰好一次交换使得字符种类相等。
}
}else {
if (num1-(cnt1[i]==1?1:0)+(cnt1[j]==0?1:0)==num2-(cnt2[j]==1?1:0)+(cnt2[i]==0?1:0)){
return true;
}
}
}
}
return false;
}