题目描述
给你两个下标从 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 仅由小写英文字母组成。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/make-number-of-distinct-characters-equal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
class Solution {
public:
bool isItPossible(string word1, string word2) {
unordered_map<char, int> mp1, mp2;
for (auto &c : word1) mp1[c]++;
for (auto &c : word2) mp2[c]++;
int s1 = mp1.size(), s2 = mp2.size();
bool flag = (word1.length() == 1 && word2.length() != 1);
flag |= (word1.length() != 1 && word2.length() == 1);
if (s1 == s2) {
if (s1 == 1 && flag) return false;
return true;
}
for (auto &it1 : mp1) {
// pick
char c1 = it1.first;
int tmp1 = (it1.second == 1)?s1-1:s1;
for (auto &it2 : mp2) {
// pick
char c2 = it2.first;
if (c1 == c2) continue;
int tmp2 = (it2.second == 1)?s2-1:s2;
int tmp1_ = tmp1;
if (mp2.find(c1) == mp2.end()) tmp2++;
if (mp1.find(c2) == mp1.end()) tmp1_++;
if (tmp1_ == tmp2) return true;
}
}
return false;
}
};