2531. 使字符串中不同字符的数目相等
给你两个下标从 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 <= 10**5-
word1和word2仅由小写英文字母组成。
此题难倒是不难,可以从数学分类考虑的角度出发,借助any和all这两个Array API来处理每一种情况,然后分别判断。
我的解
# @param {String} word1
# @param {String} word2
# @return {Boolean}
def is_it_possible(word1, word2)
s1 = Hash.new(0)
s2 = Hash.new(0)
word1.chars.each do |w|
s1[w] += 1
end
word2.chars.each do |w|
s2[w] += 1
end
if (s1.length - s2.length).abs > 2
return false
elsif (s1.length - s2.length).abs == 2
if s1.length - s2.length == 2
if s1.keys.any? { |k| s1[k] == 1 && (!s2.key?(k)) && s2.keys.any? { |k1| s2[k1] > 1 && (s1.key?(k1)) } }
return true
else
return false
end
else
if s2.keys.any? { |k| s2[k] == 1 && (!s1.key?(k)) && s1.keys.any? { |k1| s1[k1] > 1 && (s2.key?(k1)) } }
return true
else
return false
end
end
elsif (s1.length - s2.length).abs == 1
if s1.length - s2.length == 1
if s1.keys.any? { |k| s1[k] > 1 && (!s2.key?(k)) && s2.keys.any? { |k1| s2[k1] > 1 && s1.key?(k1) } }
return true
elsif s1.keys.any? { |k| s1[k] == 1 && s2.key?(k) && s2.keys.any? { |k1| k1 != k && s2[k1] > 1 && s1.key?(k1) } }
return true
elsif s1.keys.any? { |k| s1[k] == 1 && (!s2.key?(k)) && s2.keys.any? { |k1| s2[k1] > 1 && (!s1.key?(k1)) } }
return true
elsif s1.keys.any? { |k| s1[k] == 1 && (!s2.key?(k)) && s2.keys.any? { |k1| s2[k1] == 1 && s1.key?(k1) } }
return true
else
return false
end
else
if s2.keys.any? { |k| s2[k] > 1 && (!s1.key?(k)) && s1.keys.any? { |k1| s1[k1] > 1 && s2.key?(k1) } }
return true
elsif s2.keys.any? { |k| s2[k] == 1 && s1.key?(k) && s1.keys.any? { |k1| k1 != k && s1[k1] > 1 && s2.key?(k1) } }
return true
elsif s2.keys.any? { |k| s2[k] == 1 && (!s1.key?(k)) && s1.keys.any? { |k1| s1[k1] > 1 && (!s2.key?(k1)) } }
return true
elsif s2.keys.any? { |k| s2[k] == 1 && (!s1.key?(k)) && s1.keys.any? { |k1| s1[k1] == 1 && s2.key?(k1) } }
return true
else
return false
end
end
else
if s1.keys.all? { |k| (!s2.key?(k)) && s1[k] == 1 } && s2.keys.all? { |k| s2[k] > 1 }
return false
elsif s2.keys.all? { |k| (!s1.key?(k)) && s2[k] == 1 } && s1.keys.all? { |k| s1[k] > 1 }
return false
else
return true
end
end
end