有效的字母异位词
242. 有效的字母异位词
题目描述: 2020/11/23
- 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if sorted(s) == sorted(t):
return True
return False
自己的想法: 2020/11/23
- 用数组比较,我猜会超时,试一下,使用新数组记录出现的次数
- 排序,但不知道字符串怎么排:sorted
- 比较ASCII码大小,但是又可能包含unicode码
为什么error:
- 使用了双重for循环,只能和当前位置进行交换,当变换完之后还是和当前位置进行交换,所以使得出现了很多0
解题思路:2020/11/23
字典记录次数法:最好,在包含unicode码时还可以用
- 长度不相等必定false;
2.把字符串中的字母作为key,在字符串中出现次数作为value,生成dict;
3.比较两个dict对应key的value 及 s中的key是否出现在t中。class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s)!=len(t): return False ds = {} dt = {} for i in s: if i in ds: ds[i] = ds[i] + 1 else: ds[i] = 1 for j in t: if j in dt: dt[j] = dt[j] + 1 else: dt[j] = 1 for x in ds: if x not in dt or ds[x]!=dt[x]: return False return True
作者:to_otr
链接:https://leetcode-cn.com/problems/valid-anagram/solution/cai-bi-chu-xue-dictjie-fa-40ms-136mbhuan-qing-duo-/collections
class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s) != len(t): return False ds = collections.defaultdict(int) dt = collections.defaultdict(int) for i in s: ds[i]+=1 for i in t: dt[i]+=1 for i in ds: if i not in dt or ds[i]!=dt[i]: return False return True
Python中通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。为了避免这种情况的发生,可以使用collections类中的defaultdict()方法来为字典提供默认值。
collections.Counter
是一个简单的计数器,例如,统计字符出现的个数ASCII码判断(论文查重原理)
之前看数学之美有一章用这种方法判断文章内容重复度,还是蛮有用的
即用两个文本对应数字加起来判断是否一样,后面的<1e-5是判断两个浮点数是否相等,因为浮点数存在尾数问题
不过文本太短,非常容易出现两个文本恰好加起来等于一个数字,所以可以设计一种函数,将字母对应的ASCII变换一下,可以使用**2(不过貌似被出题人写了对应的测试案例过不了),好的函数是可以使两对文本相加恰好相等的概率降至极低
return abs(sum([ord(x)**0.5 for x in s])-sum([ord(y)**0.5 for y in t]))<1e-5
作者:p1PiNCh7Rz
链接:https://leetcode-cn.com/problems/valid-anagram/solution/pythonyi-xing-asciima-pan-duan-lun-wen-cha-zhong-y/
感想: 2020/11/23
以上瞎扯,看看哈希表,这才是最难的思路
从另一个角度考虑,t是 s的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s 中的额外字符,返回false 即可。
对于进阶问题,Unicode 是为了解决传统字符编码的局限性而产生的方案,它为每个语言中的字符规定了一个唯一的二进制编码。而 Unicode 中可能存在一个字符对应多个字节的问题,为了让计算机知道多少字节表示一个字符,面向传输的编码方式的 UTF−8 和 UTF−16 也随之诞生逐渐广泛使用,具体相关的知识读者可以继续查阅相关资料拓展视野,这里不再展开。
回到本题,进阶问题的核心点在于「字符是离散未知的」,因此我们用哈希表维护对应字符的频次即可。同时读者需要注意 Unicode 一个字符可能对应多个字节的问题,不同语言对于字符串读取处理的方式是不同的。
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(s) != len(t):
return False
count = {}
for char in s:
if char in count:
count[char] += 1
else:
count[char] = 1
for char in t:
if char in count:
count[char] -= 1
else:
return False
for value in count.values():
if value != 0:
return False
return True