KW47/20:学习了哈希表的知识,一共练习2个题目,现在总结如下。
第一题:有效的字母异位词,给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
- 思路:首先得知道什么是字母异位词,即两个字符串长度一样,各个字母的个数一样,只是顺序不同。
(1)第一个想法是使用字典,遍历字符串s,键是字母,值是字母出现的次数。然后遍历另一个字符串t,减去字典中对应字母出现的次数,如果次数小于0,说明t包含一个不在s中的字母。代码如下
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
d = {}
# 首先判断两个字符串长度是否相等,不等的话,返回False
if len(s) != len(t):
return False
# 遍历字符串s,在字典中记录每个字母出现的次数
for c in s:
if c not in d:
d[c] = 1
else:
d[c] += 1
# 遍历字符串t,如果有字母不在字典中,返回False。
# 或者字母在字典中,则该字母出现的次数减1。
# 如果有字母出现的次数<0,说明这个字母不在字符串s中。
for c in t:
if c not in d:
return False
else:
d[c] -= 1
if d[c] < 0:
return False
return True
第二题:赎金信,给定两个字符串ransom和magazine,第一个字符串的所有字母必须由第二个字符串中的字母构成,并且第二个字符串中的字母在第一个字符串中只能使用一次。
- 思路:
(1)第一个想法是使用字典,遍历magazine字符串,键是字母,值是字母出现的次数。然后遍历ransom字符串,减去字典中对应字母出现的次数,如果次数小于0,说明ransom包含一个使用了多次的字母。代码如下
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
d = {}
# 首先判断ransomNote长度是否>magazine,大于的话,返回False
if len(ransomNote) > len(magazine):
return False
# 遍历magazine字符串,结果存到字典
for c in magazine:
if c not in d:
d[c] = 1
else:
d[c] += 1
# 遍历ransomNote字符串,看是否都在字典中,不在的话,返回False
# 在字典的话,该字母出现的次数减1,
# 如果有字母出现的次数<0,说明ransomNote包含一个使用多次的字母
for c in ransomNote:
if c not in d:
return False
else:
d[c] -= 1
if d[c] < 0:
return False
return True