一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 本题给出两个字符串
ransomNote和magazine ransomNote和magazine都是由小写字母组成ransomNote和magazine长度都在0~10000
- 本题给出两个字符串
二、思路分析:
我们拿到本题,阅读本题和示例,心想这题也太简单了吧,先入为主的思路为:
- 首先判断字符串ransomNote长度大于字符串magazine长度时,则直接返回False
- 再来判断ransomNote字符是否在字符串magazine。如果在则返回True,则返回False
两个if判断写完后,提交AC代码,阿偶 49/126 "aab" "baa" 被NG了。
提交不成功,重新阅读题意,粗心大意的我忽略以下这句话:
- 判断
ransomNote能不能由magazine里面的字符构成 - 潜台词:字符串 magazine 字符串中字母可以组成 ransomNote 字符串
- 字符串 magazine 中的字母只能用一次
重新理解了题意,使用模拟方法可以解答该题,思路如下:
- 首先需要对字符串 ransomNote 字母进行去重
- 使用for循环对 set(ransomNote) 中的字母 i 在magazine字母中判断,如果不存在则返回False
- 使用count()函数对ransomNote.count(i) 大于 magazine.count(i) 时则返回False
- 直到遍历完set(ransomNote),则返回True
根据以上思路,我们使用Python可以轻松实现出来,代码如下:
class Solution(object):
def canConstruct(self, ransomNote, magazine):
if len(ransomNote) > len(magazine):
return False
for i in set(ransomNote):
if i not in magazine:
return False
if ransomNote.count(i) > magazine.count(i):
return False
return True
除了使用字符串 count函数来计算出现字母的次数外,那还有其他方法吗?
- 有的。可以借助列表来统计字符串的次数
- 初始化一个长度为26的列表cnt
- 使用for循环遍历字符串magazine中的字母i出现的次数cnt[i]
- 然后再使用for循环遍历ransomNote中字母j进行计算,cnt[j]<0则返回False
class Solution(object):
def canConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
if len(ransomNote) > len(magazine):
return False
cnt = [0 for i in range(26)]
for i in magazine:
tmp = ord(i)-ord("a")
cnt[tmp] = cnt[tmp] + 1
for j in ransomNote:
tmp = ord(j) - ord("a")
cnt[tmp] = cnt[tmp] - 1
if cnt[tmp] < 0:
return False
return True
该方法,时间复杂度O(m+n)比方法一要慢一些。
三、总结:
本题主要考察的是magazine字符的统计,我们使用方法一提交,AC记录如下:
时间复杂度O(n) ,需要遍历ransomNote字符串 空间复杂度O(n)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~