【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)

文章目录

  • 刷题前唠嗑
  • 题目:确定两个字符串是否接近
    • 题目描述
    • 代码与解题思路
  • 结语

刷题前唠嗑

【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)_第1张图片
LeetCode?启动!!!

刷完今天,我的每日一题就坚持一个月啦,月度勋章要到手啦

今早很尴尬,明明已经 12 点这么早睡觉了,结果早上 10 点才起床,只能说可能是最近这段时间熬夜确实比较重,身体见到有机会就趁机调养一下,这也是我早睡的目的啦

题目:确定两个字符串是否接近

题目链接:1657. 确定两个字符串是否接近

题目描述

【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)_第2张图片

代码与解题思路

func closeStrings(word1 string, word2 string) bool {
    c1, c2 := make([]int, 26), make([]int, 26)
    for _, v := range word1 {
        c1[v-'a']++
    }
    for _, v := range word2 {
        c2[v-'a']++
    }
    sort.Ints(c1)
    sort.Ints(c2)
    for i := 0; i < 26; i++ {
        if c1[i] != c2[i] {
            return false
        }
    }
    return true
}

上面代码是错的,我一开始理解错题目的意思了,我以为只要字母之间是可以任意替换的,其实不是,两个品种的字母之间想要替换需要保证他们的数量是相同的才行,举个例子:

  1. “aabbcc” 和 “aaaabc” 是没法替换的
  2. “abbbbc” 和 “accccb” 才能替换,因为 b 和 c 两个品种的数量相等

正确代码:

func closeStrings(word1 string, word2 string) bool {
    if len(word1) != len(word2) {
        return false
    }
    var c1, c2 [26]int
    for _, v := range word1 {
        c1[v-'a']++
    }
    for _, v := range word2 {
        c2[v-'a']++
    }
    for i := 0; i < 26; i++ {
        if c1[i] == 0 && c2[i] == 0 { // 如果都不存在这个数字,就继续遍历
            continue
        }
        if c1[i] == 0 || c2[i] == 0 { // 一个存在一个不存在,返回 false
            return false
        }
    }
    slices.Sort(c1[:])
    slices.Sort(c2[:])
    return slices.Equal(c1[:], c2[:])
}

这道题目说难不难,说简单也不简单,如标题,脑筋急转弯,你只需要想清楚两个点,这道题就非常容易了:

  1. 想要成功替换让两个数组相等,他们的长度必须相同。这就是第一行代码做的事情
  2. 题目支持字母之间的平替,也就是在字符串长度相同的情况下,两个字符串的字母的不同品种之间的数量相同也能满足要求。这就是后面那一大段代码做的事情,就是判断这个

所以这道题肯定是可以用位运算来做的,不过我比较懒,就不实现了

结语

开心
【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)_第3张图片

你可能感兴趣的:(LeetCode,每日一题,leetcode,哈希算法,linux)