Python:每天一道leetcode之242题
题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
字母异位词的本质就是,词中的字母均为相同数量。那么首先,字符串长度不一样的应该直接判断为false,其次用集合的去重性判断字符串中含有的字母类别是否相同。剩下才判断各类字母数量是否相等。
解法
第一步
首先将一定不符合条件的直接判错
if len(set(s+t)) != len(set(s)) or len(s) != len(t):
return False
这里用len函数去判断了s、t字符串的长度是否相等
用set的去重特性直接判断出s字符串中有几个不同字母,并且同样的利用set的去重判断t字符串中 的字母是否和s字符串中的相同。
第二步
接下来就是判断s、t字符串中的各类字母个数是否相等。由于最多26个字母,我这里采用了推导式的方式生成一个字典并将各个字母的初始值计为0。
alphabet = {k:0 for k in set(s)}
最后就是遍历s字符串中出现的字母,每出现一次,字母键对应的值加1。
遍历t中的字母,出现一次减1。判断alphabet字典中的值是否全为0就可以了。
for i in s:
alphabet[i] += 1
for j in t:
alphabet[j] -= 1
for l in alphabet.values():
if l != 0:
return False
return True
执行反馈截图
复杂度
第一步为常量时间、第二步的第一个小步骤也是常量时间(最大不过26),第二步的第二个步骤时间为O(n)+O(n),即复杂度为O(n)
联系方式
如果您对本文章有任何意见或者建议,欢迎您联系我批评指正