【LeetCode】242. 有效的字母异位词

116 阅读3分钟

image.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 本题给两个参数字符串s和字符串t,且都是由小写字母组成
    • 字符串s和字符串t的长度都在1~5*10000

二、思路分析:

我们拿到本题,读完题意后,该题与383. 赎金信题目类似。本题要求我们求出字符串s和字符串t中每一次字符出现的次数相同,即题目定义的有效字母异位词

  • 方法一:常规思路

  • 那么解答该题,最容易想到的思路如下:

    • 首先对字符串 s 和字符串 t 长度进行判断,当不相等时,则直接返回False
    • 我们对字符串 s字符使用set()函数进行去重
    • 使用for循环进行对set(s)进行遍历取出每一个字符i
    • 先对取出的字符i判断是否在字符串t.如果不在,则直接返回False
    • 借助Python底层函数count(),分别求出s.count(i)与t.count(i),不相等时则返回False
    • 直到遍历完set(s),则返回True

根据上述思路,我们能快速解答本题,速度也是超过90%的用户:

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """

        if len(s) != len(t):
            return False
        
        for i in set(s):
            if i not in t :
                return False 
            if s.count(i) != t.count(i):
                 return False
        return True

上述方法中,对于字符串中每一个字符出现次数,我们直接使用python底层函数count()来实现的。

那么,我们不使用count(),还有其他方式可以求出字符串字符出现的次数呢?

  • 方法二:哈希表

  • 方式一:定义一个初始化长度为26的列表,根据Ascii码值来求出列表的索引位置,字符出现的次数进行连续加减计数。(注:该方法在383. 赎金信已经实现了)

  • 方式二:使用字典(哈希表),字符i作为字典的key值,字符出现的次数作为字典的value值

  • 本题,来使用字典来实现一下,思路如下:

    • 先使用for循环遍历字符串s,记录字符串s每一个字符出现的次数ss[s[i]] = ss[s[i]]+1
    • 再使用for循环遍历字符串t,对字符j判断是否在ss.keys(),如果不在则返回False
    • 如在ss.keys()中,ss[t[j]] = ss[t[j]]-1.当ss[t[j]]<0 时,则返回False
    • 直到遍历完字符串t,返回True
class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """

        if len(s) != len(t):
            return False
        
        ss = {}
        for i in range(len(s)):
            if s[i] in ss.keys():
                ss[s[i]] = ss[s[i]] + 1
            else:
                ss[s[i]] = 1
        print(ss)
        for j in range(len(t)):
            if t[j] in ss.keys():
                ss[t[j]] = ss[t[j]] - 1
                if ss[t[j]] < 0:
                    return False            
            else:
                return False

        return True       
  • 方法三:排序

  • 解答本题,我们还可以换一个思路:

    • 先对字符串s和字符串t进行排序sort()
    • 然后进行比较字符串是否相等
return sorted(s)== sorted(t)

三、总结:

我们使用哈希表解答该题,AC记录如下:

image.png

时间复杂度O(n),n为字符串s长度 空间复杂度O(S),S为26个字符集长度

以上本期内容,欢迎大佬们点赞评论,下期见~~~