Python-有效字母异位词

一、什么是字母异位词   

        字母异位词‌是指由相同字母组成但排列顺序不同的单词。例如,"eat"、"tea"和"ate"都是字母异位词,因为它们由相同的字母组成,只是排列顺序不同。‌

二、思路

        (一)暴力解法

                这里可以用两层循环来判断2个字符串的元素是否一样,显然时间复杂度为O(n²),在这里大家可以自己写一下,文章就不再提供演示。

        (二)哈希表解法
        1.什么是哈希表?

        哈希表(Hash Table),也称为散列表,是一种基于关键码值(Key Value)直接进行访问的数据结构。它通过哈希函数将关键码值映射到表中的某个位置,从而实现快速的查找、插入和删除操作

        说到这儿可能大家对哈希表还是有点不理解,那么如果我说数组、集合、映射都是哈希表是不是好理解了。其实哈希表就是将关键码(比如:索引、下标等)映射到表的某个位置,从而实现快速对元素进行操作。

        在这里大家可以记住一句话:

        要快速判断一个元素是否出现在集合的时候,我们要优先考虑哈希法。

        2.什么是哈希法?

         哈希法‌是一种通过哈希函数将输入数据映射到固定长度的输出值(哈希值)的方法。哈希法的基本思想是通过一个哈希函数将关键字映射到哈希表中的某个位置,从而实现快速查找。哈希表是一种基于数组的数据结构,每个元素都与一个唯一的键值相关联,哈希函数根据关键字计算出在数组中的位置,这个位置称为哈希地址。

        到这里大家就可以明白,哈希算法的关键是要根据具体需求写一个函数,将关键字映射到哈希表(数组、集合等)的某个位置。   结合 字母异位词 本身,我们也使用哈希法。

三、具体分析

        在这里我采用 数组 的方式做一下解答,因为数组相对来说简单易懂,大家也可以尝试用集合或者其他的哈希表来解答。

        1.首先用我们用两个字符串来举例

s = aee   和  t=eae

元素 0 0 0 ... 0 0
索引 0 1 2 ... 25 26

        2.根据哈希算法,我们可以把 s 字符串的地址映射到数组里,可以先定义一个有27个空间的空数组,用来存储27个英文字母,当然在这里要做个说明,哈希算法其实是用空间换取时间,具体问题具体分析。

        3.接下来,可以将字符串 s 映射到数组中,同时数组的元素 + 1;在做字符串 t 的映射的时候 数组的元素 -1 ,最后,可以通过判断数组中是否有不为0的元素即可。有不为0的元素就说明不是字母异位词。

四、代码实现

class Solution(object):
    def isAnagram(self, s, t):
        """

        :param s: str
        :param t: str
        :return: bool
        """
        # 定义数组 26 个字母
        record = [0] * 26
        # s中出现的字母 在对应的位置 + 1
        for i in s:
            record[ord(i) - ord('a')] += 1

        # t中出现的字母 在对应的位置 -1
        for i in t:
            record[ord(i) - ord('a')] -= 1

        # 判断record数组中是否有 大于 0的元素
        for i in range(26):
            if record[i] != 0:
                return False
        return True

你可能感兴趣的:(python,哈希算法,算法,数据结构)