Leetcode 2531 (any和all写到吐)

2531. 使字符串中不同字符的数目相等
给你两个下标从 0 开始的字符串 word1word2
一次 移动 由以下两个步骤组成:

  • 选中两个下标 ij ,分别满足 0 <= i < word1.length0 <= j < word2.length
  • 交换 word1[i]word2[j]
    如果可以通过 恰好一次 移动,使 word1word2 中不同字符的数目相等,则返回 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
  • word1word2 仅由小写英文字母组成。

此题难倒是不难,可以从数学分类考虑的角度出发,借助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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容