Leetcode 242:有效的字母异位词(最详细解决方案!!!)

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

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

说明:
你可以假设字符串只包含小写字母。

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

解题思路

首先我们想到的解决思路就是将s的所有组合存入在一个容器中,然后判断t是不是这个容器中的元素即可。

class Solution:
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        from itertools import permutations
        s_per = [''.join(i) for i in permutations(s)]
        if t in s_per:
            return True
        return False

超级粗暴的解法( ̄▽ ̄)”

另外一种思路就是我们统计s中所有字符的个数,只要t中和s中字符都一样且数目都一样,那么就可以了。由于统计字符个数,所以我们可以使用map这个结构(当然也可以使用collections.Counter)。

class Solution:
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        record_s = {}
        record_t = {}
        for i in s:
            record_s[i] = record_s.get(i, 0) + 1

        for i in t:
            record_t[i] = record_t.get(i, 0) + 1
        return record_s == record_t

一个更加pythonic的做法

class Solution:
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        from collections import Counter
        return Counter(s) == Counter(t)

这里提供一个更快的解法,是通过查表法实现的。

class Solution:
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        for i in range(ord('a'), ord('z')+1):
            if s.count(chr(i)) != t.count(chr(i)):
                return False
        return True

该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/80570244