代码随想录算法训练营第五天(1)|242.有效的字母异位词

57 阅读2分钟

题目描述

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

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

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

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

代码示例

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 初始化长度为26的数组,用于记录字符出现次数
        record = [0] * 26
        
        # 遍历字符串s,更新字符出现次数
        for char in s:
            index = ord(char) - ord('a')
            record[index] += 1
        
        # 遍历字符串t,更新字符出现次数
        for char in t:
            index = ord(char) - ord('a')
            record[index] -= 1
        
        # 检查数组中是否还有非零元素,如果有则不是字母异位词
        for count in record:
            if count != 0:
                return False
        
        # 所有字符出现次数相等,是字母异位词
        return True

# 示例代码
solution = Solution()
result = solution.isAnagram("anagram", "nagaram")
print(result)  # 输出 True

一开始看到题目时,考虑到暴力解法,即遍历第一个字符串中的每一个字符,判断其是否在第二个字符串中出现过。这种方法是直观而简单的,但在效率上可能面临较大挑战,尤其当字符串长度较大时。

然而,通过阅读代码随想录后,我发现了一种更为巧妙的解法。作者利用了长度为26的数组 record,将字符串s中的每个字符 s[i] - 'a' 的值作为 record 数组的索引,然后将对应位置的元素加1。对于字符串t,则将相应位置的元素减1。最终,如果两个字符串是字母异位词,那么 record 数组的所有元素都应该为0。

这样的解法避免了对两个字符串进行排序或比较,大大提高了效率。通过巧妙地利用数组记录字符出现的次数,这个算法在时间和空间复杂度上都表现出较好的性能。

这次学习让我更深刻地理解了如何通过数组进行字符频次统计,提高了解决问题的灵活性和效率。在今后的算法学习中,我期待能够运用这样的巧妙思路解决更多有趣的问题。