时间:2020-05-29
题目地址:https://leetcode-cn.com/problems/valid-anagram/
题目难度:Easy
题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
思路1:第一反应是统计次数,想用哈希来着,一直在用set,这里还是有点晕啊。
代码段1:通过
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
temp1 = {}
temp2 = {}
for i in s:
temp1[i] = s.count(i)
for j in t:
temp2[j] = t.count(j)
return (temp1 == temp2)
总结:
- 大神写的。我的和大神的相比执行用时和内存消耗分别是:9156 ms 13.6 MB | 64 ms 13.8 MB,count相当于在遍历的基础上又加了个遍历。
- python的dict就是map,map可能是使用哈希表,可能是使用二叉树,python是使用的哈希表
- dict 的 get 获取key对应的值,没有则为none,也可定义一个value
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dict1, dict2= {}, {}
for i in s:
dict1[i] = dict1.get(i, 0) + 1
for j in t:
dict2[j] = dict2.get(j, 0) + 1
return dict1 == dict2
思路2:不使用map使用裸写的string。题目只包含小写字母
代码段2:通过
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dict1, dict2= [0] * 26, [0] * 26
for i in s:
dict1[ord(i) - ord('a')] += 1
for j in t:
dict2[ord(j) - ord('a')] += 1
return dict1 == dict2
总结:
- 使用数组实现了最朴素的哈希表,单从性能上看思路2比思路1快些,操作数组理论上比操作哈希表快,执行用时和内存消耗并没有体现,应该是测试用例的问题
- ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
思路3:排序
代码段3:通过
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if(len(s) != len(t)):
return False
temp1, result1 = list(s), 0
temp2, result2 = list(t), 0
temp1.sort()
temp2.sort()
if(temp1 != temp2):
return False
else:
return True
总结:
- 大佬写的排序。python把排序都内置好了,即使使用快排也是O(nlogn)
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return sorted(s) == sorted(t)