[python 刷题] 242 Valid Anagram

2023-09-17 10:29:06

[python 刷题] 242 Valid Anagram

题目:

Given two strings s and t, return true if t is an anagram of s, and false otherwise.

An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.

这里 Anagram 的定义就是可以通过重新排序获得的单词,如 cat 可以获得 act,这种,所以满足的条件有两个:

  1. 字串 A 里包含的字母和字串 B 一样多
  2. 字串 A 中出现字母的频率与字串 B 一样多

我刚开始的写法是这样的:

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # s being an anagram of t means:
        #   1. same length
        #   2. same # of chars
        if len(s) != len(t):
            return False

        # create a dict to store key val frequency
        char_dict = {}
        for l in s:
            if l in char_dict:
                char_dict[l] = char_dict[l] + 1
            else:
                char_dict[l] = 1

        # find if all chars appeared in the dict
        for l in t:
            if l not in char_dict:
                return False
            if char_dict[l] == 1:
                del char_dict[l]
            else:
                char_dict[l] = char_dict[l] - 1

        return True

第一个检查字符串的长度,二者不一致就可以直接返回 false

然后进入两个循环,第一个循环创建一个 dict,进行字符和频率的 mapping,第二个循环检查当前字符是否出现在 dict 中,如果没有返回 false,如果有,那么出现的频率减少

如果第二个循环走完了,就代表两个字符的出现的字符串频率一致,也就可以返回 true

写完后我参考了一下别人的写法,发现一个更优雅的答案:

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t):
            return False

        countS, countT = {}, {}

        for i in range(len(s)):
            countS[s[i]] = 1 + countS.get(s[i], 0)
            countT[t[i]] = 1 + countT.get(t[i], 0)
        return countS == countT

我找了一下,dict 中的 get 第二个参数为默认值,即当当前值不存在于 dict 中使用的值,这样可以减少一重 if/else

比较两个 dict 这个我找了下资料, Comparing two dictionaries and checking how many (key, value) pairs are equal

中提到了 python 的文档中 Mapping Types — dict¶ 用了这个案例:

The following examples all return a dictionary equal to {"one": 1, "two": 2, "three": 3}:

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True

Providing keyword arguments as in the first example only works for keys that are valid Python identifiers. Otherwise, any valid keys can be used.

另一个 post What does the == operator actually do on a Python dictionary? 中提到,== 中有提到,== 的结果为 true 的情况 sorted(key, value) 结果完全一致,第一条回答找了一个 python 的源码实现,说内部进行递归调用判断 dict 中每个元素都是相通的,不过目前代码的 reference 消失了

总结就是,如果两个 dict 的 key 相同,每个 key 的 value 也相同,就可以用 ==

更多推荐

gin 基本使用

gin初体验import("net/http""github.com/gin-gonic/gin")funcmain(){r:=gin.Default()r.GET("/ping",func(c*gin.Context){c.JSON(http.StatusOK,gin.H{"message":"pong",})})r

ESP32C3 PWM输出

目前对于遥控双发差速小飞机计划采用如下架构:ESP32C3做主控,兼具遥控收发和飞行控制锂电池供电,带电量检测双发,720空心杯电机,55mm桨,带电流检测MPU6050加速度计和陀螺仪预留4个控制信号输出马达控制要用到pwm,今天把esp32c3的pwm跑一下。简介esp32c3中把pwm外设称为“LEDPWM控制器

Qt重写QTreeWidget实现拖拽

介绍此文章记录QTreeWidget的重写进度,暂时停滞使用,重写了QTreeWidget的拖拽功能,和绘制功能,自定义了数据结构,增加复制,粘贴,删除,准备实现动态刷新数据支持千万数据动态刷新,重写了部分代码,重写了滑块拖拽但是有bug。效果展示实现功能实现了自定义节点类来存储数据。item采用Label来实现富文本

C++数据结构题:DS 顺序表--连续操作

建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)该类具有以下成员函数:构造函数:实现顺序表的初始化。插入多个数据的multiinsert(inti,intn,intitem[])函数,实现在第i个位置,连续插入来自数组item的n个数据,即从位置i开始插入多个数据。删除多个数据的multidel(i

JAVAEE初阶相关内容第十二弹--多线程(进阶)

目录一、JUC的常见类1、Callable接口1.1callable与runnable1.2代码实例(1)不使用Callable实现(2)使用Callable实现1.3理解Callable1.4理解FutureTask2、ReentrantLock2.1ReentrantLock的用法2.2ReentrantLock优

中科院预警名单

2023年预警名单(fenqubiao.com)如果论文投稿到中国科学院预警期刊,可能会面临以下情况:1.预警期刊一般审稿周期长,容易出现迟迟不见回音的情况。2.这类期刊的学术质量参差不齐,接受论文的学术标准可能不严格。3.预警期刊发表论文的学术影响力比较有限,不容易为作者带来高引用率和知名度。4.在中国的一些高校和科

新版考勤管理系统正式发布

O2OA(翱途)开发平台V8.1版本,因老的考勤管理系统已经无法满足用户需求,并且在架构和业务结构上都不再符合现在大多数考勤功能的需求。我们对考勤管理重新进行了开发,全新的版本更好用,更直观。考勤管理对员工的工作出勤情况进行记录、分析和报告的过程。它是对员工工作表现评估的重要依据,也是企业管理中的重要组成部分。考勤管理

多线程的学习上篇

座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.引入进程这个概念的目的引入进程这个概念,最主要的目的,是为了解决“并发编程"这样的问题.这是因为CPU进入了多核心的时代要想进一步提高程序的执行速度,就需要充分的利用CPU的多核资源其实,多进程编程,已经可以解决并发编程的问题了.已经可以利用起来CPU多核资源了.

【C++ 学习 ㉒】- 超详解 AVL 树的插入、平衡调整以及删除(含源代码)

目录一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的平衡调整五、AVL树的删除六、AVL树的实现6.1-AVL.h6.2-test.cpp一、AVL树的概念二叉搜索树查找算法的性能取决于二叉树搜索树的形状,而二叉搜索树的形状则取决于数据集。如果数据呈有序排列,则二叉搜索树为单支树,查找的时间复杂

xxl-job的原理(1)

xxl-job的架构系统组成调度中心:进行任务统一调度,可以新增和管理执行器和任务;执行器:任务执行依赖的组件,一个执行器可以关联多个任务,添加的执行器可以自动注册到调度中心上;任务:具体的业务执行逻辑,针对该逻辑可以在调度中心配置定时策略,定时策略支持cron表达式和固定速率;系统架构![image-20230918

全国职业技能大赛云计算--高职组赛题卷⑤(容器云)

全国职业技能大赛云计算--高职组赛题卷⑤(容器云)第二场次题目:容器云平台部署与运维任务2基于容器的web应用系统部署任务(15分)任务3基于容器的持续集成部署任务(15分)任务4Kubernetes容器云平台部署与运维(15分,本任务只公布考试范围,不公布赛题)需要环境的可以私信联系博主!!!第二场次题目:容器云平台

热文推荐