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

本文主要是介绍【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]intfor _, 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 { // 一个存在一个不存在,返回 falsereturn false}}slices.Sort(c1[:])slices.Sort(c2[:])return slices.Equal(c1[:], c2[:])
}

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

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

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

结语

开心

这篇关于【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437260

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时