给你两个下标从 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
仅由小写英文字母组成。
class Solution {
public:
bool isItPossible(string word1, string word2) {
int cnt1[26]={0},cnt2[26]={0};
for(char c:word1)cnt1[c-'a']++;
for(char c:word2)cnt2[c-'a']++;
for(int i=0;i<26;i++)if(cnt1[i])for(int j=0;j<26;j++)if(cnt2[j]){
cnt1[i]--;cnt2[i]++;cnt1[j]++;cnt2[j]--;
int x=0,y=0;
for(int k=0;k<26;k++)if(cnt1[k])x++;
for(int k=0;k<26;k++)if(cnt2[k])y++;
if(x==y)return true;
cnt1[i]++;cnt2[i]--;cnt2[j]++;cnt1[j]--;
}
return false;
}
};