有效的字母异位词

242. 有效的字母异位词

题目描述: 2020/11/23

  1. 给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if sorted(s) == sorted(t):
            return True
        return False

自己的想法: 2020/11/23

  1. 用数组比较,我猜会超时,试一下,使用新数组记录出现的次数
  2. 排序,但不知道字符串怎么排:sorted
  3. 比较ASCII码大小,但是又可能包含unicode码

为什么error:

  1. 使用了双重for循环,只能和当前位置进行交换,当变换完之后还是和当前位置进行交换,所以使得出现了很多0

解题思路:2020/11/23

字典记录次数法:最好,在包含unicode码时还可以用

  1. 长度不相等必定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

collections

collections.defaultdict()的使用

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

作者:mnm135
链接:https://leetcode-cn.com/problems/valid-anagram/solution/ha-xi-biao-fang-fa-ke-gua-ying-geng-da-gui-mo-zi-f/来源:力扣(LeetCode)

posted @ 2021-04-09 10:46  Tonka  阅读(99)  评论(0编辑  收藏  举报