【LeetCode简单题242】-- 有效的字母异位词(20)

声明

今天是LeetCode 简单第20 道题,以此作为练习记录,欢迎交流。文中也会给出所参考的文章链接,感谢前辈们的总结。
(手动比心ღ( ´・ᴗ・` ))

题目

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:

输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

注解:
即两个字符串所含有的字符是否相同

正文

总结

思路1:
用字典存放字符串中的字母。

读取第一个字符串的每个字符,并将其存放于字典中。再遍历 字符串 t 的每个字符,并与字典比较。

进一步明确思路:

  • 遍历字符串 s ,并用字典存储26个 字符,作为键;字符出现次数 作为值
  • 在遍历字符串 t ,若 t 中字符出现在 字典中,则减1,否则继续向下。
  • 遍历结束后,查看字典中 键的值是否都为0。

看解答后,如何实现?

  • 首先判断两个字符串长度是否相等,不相等则直接返回 false
  • 若相等,则初始化 26 个字母哈希表,遍历字符串 s 和 t
  • s 负责在对应位置增加,t 负责在对应位置减少
  • 如果哈希表的值都为 0,则二者是字母异位词

在这里插入图片描述


import collections
class Solution:
    def isAnagram(self, s: str, t: str) -> bool: 
    
        # 长度不等的处理
        if len(s) != len(t):
            return False
            
        # 新建字典dict
        dict = collections.defaultdict(int)
        # 遍历字符串 s 和 t:s 在相同位置+1,t 在相同位置减1
        #   for c in s:
        #      dict[c] = dict[c] + 1 不能同时遍历 s 和 t 
        
        for i in range(len(s)): #  for i in len(s)
            dict[s[i]] = dict[s[i]] + 1 # 注意括号:字符串的每个字符使用方括号不是圆括号
            dict[t[i]] = dict[t[i]] - 1
        # 遍历dict的值 是否为0
        for value in dict.values(): # 不是dict.values
            if value != 0:
                return False # 都等于0 呢 ?
        return True  # 没写这个
        
N = Solution()
N.isAnagram('anagram',"nagaram")

注意:

  • import collections

  • dict 的使用:dicts[ 字典的键 ] = 对应键的值
    i = 0:
    dicts[ s[0]] + 1 即 { ‘a’:1,‘n’ :-1 }

  • 遍历字典的值:for val in dicts.values():

  • 为什么不用 直接用字典而用 collections库?
    当key不在字典中时,使用dict访问,报错;而使用collections.defaultdict访问会返回默认值。

dict() 和collections.defaultdict的区别

思路2:
利用集合存放,比较是否相同。
将字符串 s ,t 中的字符分别存入集合中并排序,比较两个集合是否相同。

注意比较不要用 if 判断,改用 return a==b 这种形式。

或是转列表,思路均相同。



class Solution:
    def isAnagram(self, s: str, t: str) -> bool: 
    # 方法2: 字符串转列表; 比较
        s_sorted = sorted(list(s))
        t_sorted = sorted(list(t))
        # 比较
        # if s_sorted == t_sorted:
        #     print(True)
        # else:
        #     print(False)
        return s_sorted == t_sorted
     

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

解答:
使用哈希表而不是固定大小的计数器。想象一下,分配一个大的数组来适应整个 Unicode 字符范围,这个范围可能超过 100万。哈希表是一种更通用的解决方案,可以适应任何字符范围。

收获

  1. python中遍历dict的value:
    dict.values() 注意有括号
    python中遍历dict的value

  2. List item

添加要改颜色的字体

添加要改颜色的字体

添加要改颜色的字体

添加要改颜色的字体

发布了71 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42025376/article/details/104826430
今日推荐