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

刷题前唠嗑


LeetCode启动!!!

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

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

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

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

题目描述

代码解题思路

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. 题目支持字母之间的平替,也就是字符串长度相同的情况下,两个字符串的字母不同品种之间的数量相同也能满足要求。这就是后面那一大段代码做的事情,就是判断这个

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

结语

开心

原文地址:https://blog.csdn.net/Locky136/article/details/134707484

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_41062.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注