声明
今天是LeetCode 简单第20 道题,以此作为练习记录,欢迎交流。文中也会给出所参考的文章链接,感谢前辈们的总结。
(手动比心ღ( ´・ᴗ・` ))
题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
注解:
即两个字符串所含有的字符是否相同
正文
总结
思路1:
用字典存放字符串中的字母。
读取第一个字符串的每个字符,并将其存放于字典中。再遍历 字符串 t 的每个字符,并与字典比较。
进一步明确思路:
- 遍历字符串 s ,并用字典存储26个 字符,作为键;字符出现次数 作为值
- 在遍历字符串 t ,若 t 中字符出现在 字典中,则减1,否则继续向下。
- 遍历结束后,查看字典中 键的值是否都为0。
看解答后,如何实现?
- 首先判断两个字符串长度是否相等,不相等则直接返回 false
- 若相等,则初始化 26 个字母哈希表,遍历字符串 s 和 t
- s 负责在对应位置增加,t 负责在对应位置减少
- 如果哈希表的值都为 0,则二者是字母异位词
import collections
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 长度不等的处理
if len(s) != len(t):
return False
# 新建字典dict
dict = collections.defaultdict(int)
# 遍历字符串 s 和 t:s 在相同位置+1,t 在相同位置减1
# for c in s:
# dict[c] = dict[c] + 1 不能同时遍历 s 和 t
for i in range(len(s)): # for i in len(s)
dict[s[i]] = dict[s[i]] + 1 # 注意括号:字符串的每个字符使用方括号不是圆括号
dict[t[i]] = dict[t[i]] - 1
# 遍历dict的值 是否为0
for value in dict.values(): # 不是dict.values
if value != 0:
return False # 都等于0 呢 ?
return True # 没写这个
N = Solution()
N.isAnagram('anagram',"nagaram")
注意:
-
import collections
-
dict 的使用:dicts[ 字典的键 ] = 对应键的值
i = 0:
dicts[ s[0]] + 1 即 { ‘a’:1,‘n’ :-1 } -
遍历字典的值:for val in dicts.values():
-
为什么不用 直接用字典而用 collections库?
当key不在字典中时,使用dict访问,报错;而使用collections.defaultdict访问会返回默认值。
dict() 和collections.defaultdict的区别
思路2:
利用集合存放,比较是否相同。
将字符串 s ,t 中的字符分别存入集合中并排序,比较两个集合是否相同。
注意比较不要用 if 判断,改用 return a==b 这种形式。
或是转列表,思路均相同。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 方法2: 字符串转列表; 比较
s_sorted = sorted(list(s))
t_sorted = sorted(list(t))
# 比较
# if s_sorted == t_sorted:
# print(True)
# else:
# print(False)
return s_sorted == t_sorted
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解答:
使用哈希表而不是固定大小的计数器。想象一下,分配一个大的数组来适应整个 Unicode 字符范围,这个范围可能超过 100万。哈希表是一种更通用的解决方案,可以适应任何字符范围。
收获
-
python中遍历dict的value:
dict.values() 注意有括号
python中遍历dict的value -
List item
添加要改颜色的字体
添加要改颜色的字体
添加要改颜色的字体
添加要改颜色的字体