【Python3】【力扣题】383. 赎金信

2023-12-08 04:30
文章标签 python3 383 赎金 力扣题

本文主要是介绍【Python3】【力扣题】383. 赎金信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【力扣题】题目描述:

题解:

两个字符串ransomNote和magazine,ransomNote中每个字母都在magazine中一一对应(顺序可以不同)。

即分别统计两个字符串中每个字母出现的次数,ransomNote中每个字母的个数小于等于magazine中该字母对应的个数。

【Python3】代码:

1、解题思路:使用collections.Counter()分别统计两字符串的字母及出现次数,比较相同字母的个数。

(1-1)若某字母在ransomNote中的个数大于在magazine中的个数,则有元素在magazine字符串中不存在。

知识点:len(...):获取序列(字符串、列表等)的长度。

              collections.Counter(...):字典子类,计数器,统计元素和元素出现的次数。

              字典.items():返回可迭代的字典的所有键值对,键值对是元组形式 (键, 值)。

              字典[键]:获取字典中键对应的值。也可给键赋值或修改值:字典[键]=值。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:from collections import Counterif len(ransomNote) > len(magazine): return Falsea, b = Counter(ransomNote), Counter(magazine)for k,v in a.items():if a[k] > b[k]:return Falsereturn True

(1-2)两个计数器相减,即相同的键对应的值相减,若相减后仍有元素的值大于0,则有元素在magazine字符串中不存在。

知识点:collections.Counter(可迭代对象1) - collections.Counter(可迭代对象2):两个可迭代对象中相同元素的值相减,只返回结果值大于0的元素。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:from collections import Counterif len(ransomNote) > len(magazine): return Falsereturn not Counter(ransomNote) - Counter(magazine)

注解:

2、解题思路:用一个字典记录每个字母的个数。

(2-1)字符串ransomNote中统计每个字母的个数,字符串magazine将字母对应的个数从字典中减去。若最终字典中有字母的值大于0,则有元素在magazine字符串中不存在。

知识点:collections.defaultdict(...):字典子类,若字典中某键不存在,则调用工厂函数返回默认值。

              字典.values():返回可迭代的字典的所有值。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:from collections import defaultdictif len(ransomNote) > len(magazine): return Falsed = defaultdict(int)for x in ransomNote:d[x] += 1for y in magazine:d[y] -= 1for val in d.values():if val > 0:return Falsereturn True

(2-2)两个字符串反过来统计,字符串magazine中统计每个字母的个数,字符串ransomNote将字母对应的个数从字典中减去,若减去后该字母的值小于0,则有元素在magazine字符串中不存在。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:from collections import defaultdictif len(ransomNote) > len(magazine): return Falsed = defaultdict(int)for y in magazine:d[y] += 1for x in ransomNote:d[x] -= 1if d[x] < 0:return Falsereturn True

3、解题思路:用一个列表记录每个字母的个数。以字母距离“a”的间隔作为下标。字符串ransomNote中统计每个字母总个数,字符串magazine将字母对应的个数从列表中减去。若结果中有元素大于0,则有元素在magazine字符串中不存在。

(3-1)知识点:[0]*26:即长度为26的元素都是0的列表,[0,0,...0,0]。

             ord(...):获取字符的ascii值或unicode值。

             列表[下标]:获取列表中下标对应的元素。也可修改下标对应的元素值:列表[下标]=值。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:if len(ransomNote) > len(magazine): return False     alist = [0] * 26 for x in ransomNote:alist[ord(x) - ord("a")] += 1for y in magazine:alist[ord(y) - ord("a")] -= 1for val in alist:if val > 0:return Falsereturn True

(3-2)知识点:itertools.chain(可迭代对象1, 可迭代对象2,...):返回一个迭代器,包含多个可迭代对象的所有元素。

             enumerate(...):返回可迭代的所有元素下标和元素,元组形式 (下标, 元素)。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:from itertools import chainn = len(ransomNote)if n > len(magazine): return Falsealist = [0] * 26 for i,x in enumerate(chain(ransomNote,magazine)):if  i < n: alist[ord(x)-ord("a")] += 1else:alist[ord(x)-ord("a")] -= 1for val in alist:if val > 0:return Falsereturn True

(3-3)知识点:itertools.zip_longest(可迭代对象1, 可迭代对象2, fillvalue=None):返回一个迭代器,将两个可迭代对象的元素按对应位置一一组成元组。所有元素遍历完,若其中一个可迭代对象没有元素了,可用fillvalue参数指定默认值来填充空缺,若没有指定fillvalue,则用None填充空缺。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:from itertools import zip_longestif len(ransomNote) > len(magazine): return False  alist = [0] * 26for x,y in zip_longest(ransomNote,magazine,fillvalue=0):if x != 0: alist[ord(x)-ord("a")] += 1if y != 0: alist[ord(y)-ord("a")] -= 1for val in alist:if val > 0:return Falsereturn True

4、解题思路:将字符串ransomNote中字母去重,再遍历元素,比对字母在两个字符串中出现的次数,若所有字母在ransomNote中的个数都小于magazine中的个数,则返回True。

知识点:set(...):转为集合,集合中的元素不重复。

              序列.count(...):统计元素在序列(字符串,列表等)中出现的次数。

              all(...):判断可迭代对象(元组,列表)中的所有元素是否都为True。

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:if len(ransomNote) > len(magazine): return False  return all(ransomNote.count(x) <= magazine.count(x) for x in set(ransomNote))

这篇关于【Python3】【力扣题】383. 赎金信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python安装:Mac 使用brew 安装Python2 和 Python3

安装python ## python2brew install python ## python3brew install python3 出现错误 Error: An unexpected error occurred during the `brew link` stepThe formula built, but is not symlinked into /usr/loc

Python: #!/usr/bin/python3 #!/usr/bin/env python3

只能放在第一行,第二行就没有效果了。 1. 路径不同 #!/usr/bin/python3&& #!/usr/bin/env python3写在脚本语言第一行的目的是 想要以什么可执行程序去运行这个文件中的代码。 #!/usr/bin/python3是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python3解释器; #!/usr/bin/env python3这种用法是为了

Linux搭建Python3、Django环境

开发十年,就只剩下这套架构体系了! >>>    好久没写了,朋友们,我又回来了。 安装Python3 Python全部版本下载地址:         https://www.python.org/ftp/ 解决RedHat,使用Python3退格出现乱码问题:         yum -y install readline-devel.x86_64 下载Python3:

ubuntu 安装python3 教程

本篇教程,主要介绍如何在Ubuntu上安装python3教程。 1、查看是否有python 在安装前,首先看看自己系统上,是否存在python环境,可能有些系统,默认就安装过python,如果已经有python了,可以直接跳过安装教程。 2、安装步骤 apt update && apt install -y python3 python3-pip

【python requests警告】python3.x requests库取消ssl验证,InsecureRequestWarning: Unverified HTTPS request is be

警告信息: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warni

设置python4delphi支持python3.X

看不懂也要跟踪下,哪哪出问题了,嗯,是python的Py_Initialize()出问题,这行代码   Py_Initialize             := Import('Py_Initialize'); 咋办呢,万能的互联网啊(哪天不能上网,那是不是也活的差不多了) 网上说,一般出这个问题,是python的路径出问题了,系统环境变量里找不着python了,哦,是这样,但是我不能设置p

win7系统安装python2和python3

之前我的电脑上已经安装了python2.7,是采用Anaconda来搭建的。 什么是Anaconda呢? Anaconda是一个开源的Python发行版,其包含了conda、Python等180多个科学包及其依赖项。Anaconda 是跨平台的,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。A

Python3获取excel中任意单元格数据(2)

#运行该程序,首先在桌面新建一个名为"数据.xlsx"的excel文件,并且该excle具有有效数据# 第一步:导入包from openpyxl import load_workbook, Workbookimport os# 第二步:定义函数,返回文件存放的路径def GetDesktopPath():return os.path.join(os.path.expanduser('~'),

python3读取excel内容(1)

通过python读取excel中sheet里边的内容 import xlrdmyFile = xlrd.open_workbook('1.xlsx') #打开一个excle文件table = myFile.sheets()[0] #打开第一个sheetnrows = table.nrows #读取该sheet的行数for i in range(nrows): #遍历每一行if i == 0