【Python3】【力扣题】242. 有效的字母异位词

【力扣题】题目描述:

【Python3】【力扣题】242. 有效的字母异位词_第1张图片

【Python3】代码:

1、解题思路:若字符串长度相同,依次遍历元素,比较两个字符串的该元素个数是否相同。【耗时长】

知识点:len(...):获取序列(字符串、列表等)长度。

              序列.count(...):统计序列中指定元素的个数。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 耗时长
        if len(s) != len(t): return False
        for x in s:
            if s.count(x) != t.count(x): return False
        return True

2、解题思路:哈希表。

本题:两个字符串中只有小写字母。可用长度为26的列表。也可用字典(或字典子类)。

(2-1)一个列表。若字符串长度相同,遍历其中一个字符串,记录字母的个数;再遍历另一个字符串,从列表中减去字母的个数,若列表中有元素小于0,则有不一样的字母。

知识点:[ x ] * n:列表中的元素x重复n次,即列表中有n个x。

              ord(...):获取字符的ascii值或unicode数值。

注解:res[ord(x) - ord('a')]:列表res中以该字母与字母a的距离(ascii/unicode)作为索引号。

           字符串长度相同,若一个字符串有的字母,另一个字符串没有该字母,则列表中某元素必定大于0也必定某元素小于0,因此判断小于0即可。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t): return False
        res = [0] * 26
        for x in s:
            res[ord(x) - ord('a')] += 1
        for y in t:
            res[ord(y) - ord('a')] -= 1
            if (res[ord(y) - ord('a')]) < 0: return False
        return True

(2-2)若字符串长度相同,同时遍历两个字符串,其中一个字符串记录字母的个数,另一个字符串从列表中减去字母的个数,若两个字符串中字母个数都相同,最终列表中只有元素0。

① 一个列表。

知识点:zip(a,b):将多个可迭代的对象,按对应位置把元素打包成一个个元组,最终是由元组组成的列表。

              set(...):转为集合。集合中的元素不重复(即去重)。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t): return False
        res = [0] * 26
        for x,y in zip(s,t):
            res[ord(x) - ord('a')] += 1
            res[ord(y) - ord('a')] -= 1
        if len(set(res)) != 1: return False
        return True

② 一个字典。

知识点:collections.defaultdict(...):字典子类。参数为工厂函数,例如:int。

              字典.values():返回可迭代的字典中所有值。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import defaultdict
        if len(s) != len(t): return False
        res = defaultdict(int)
        for x,y in zip(s,t):
            res[x] += 1
            res[y] -= 1
        if len(set(res.values())) != 1: return False
        return True

(2-3)若字符串长度相同,遍历两个字符串,分别统计各字母的个数,判断两个列表是否相同。

① 两个列表。

注解:res1, res2 = [0] * 26, [0] * 26 :即res1,res2都是有26个0的列表,[0,0,...0]。

           return res1 == res2 :若res1的值和res2的值相同,返回True,不同返回False。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t): return False
        res1, res2 = [0] * 26, [0] * 26
        for x,y in zip(s,t):
            res1[ord(x) - ord('a')] += 1
            res2[ord(y) - ord('a')] += 1
        return res1 == res2

② 两个字典。

知识点:字典[键]:获取键对应的值。可赋值,即字典[键]=值。

               字典.get(键,默认值):获取键的值,若没有该键,返回默认值。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t): return False
        res1 = {}
        res2 = {}
        for x in s:
            res1[x] = res1.get(x,0) + 1
        for y in t:
            res2[y] = res2.get(y,0) + 1
        return res1 == res2

3、解题思路:若字符串长度相同,分别用计数器记录字母出现的次数,判断计数器是否相同。

知识点:collections.Counter():字典子类。计数器,以字典形式记录元素以及其个数。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import Counter
        if len(s) != len(t): return False
        return Counter(s) == Counter(t)

4、解题思路:排序。若字符串长度相同,分别将两个字符串排序后,判断是否相同。

知识点:sorted(...):将序列(字符串、列表等)排序,返回排序后的新列表。

              operator.eq(a,b):比较两个字符串、列表等是否相等。与a==b相同。

补充:operator 模块提供了一套与 Python 的内置运算符对应的高效率函数。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t): return False
        return sorted(s) == sorted(t)
        # 或者
        from operator import eq
        if len(s) != len(t): return False
        return eq(sorted(s),sorted(t))

注:先判断两个字符串的长度是否相同,若相同,再比较字母。可提高一点速度。

你可能感兴趣的:(力扣题,leetcode,python)