数据结构与算法之 leetcode 哈希表字母异位词 字符频率统计

数据结构与算法阿木 发布于 2025-07-12 12 次阅读


摘要:

在LeetCode中,字母异位词是一个经典的数据结构与算法问题。本文将围绕这一主题,从问题背景、解决方案、代码实现以及性能分析等方面进行深入探讨,帮助读者更好地理解和掌握这一算法。

一、问题背景

字母异位词是指由相同的字母组成,但排列顺序不同的单词。例如,"listen"和"silent"就是一对字母异位词。在LeetCode中,字母异位词问题通常要求我们编写一个函数,判断两个字符串是否为字母异位词。

二、解决方案

解决字母异位词问题的关键在于统计字符串中每个字符的出现频率,并比较两个字符串的字符频率是否相同。以下是几种常见的解决方案:

1. 排序法

2. 哈希表法

3. 字符数组法

三、排序法

排序法是最直观的解决方案。我们可以将两个字符串分别排序,然后比较排序后的字符串是否相同。如果相同,则两个字符串是字母异位词;否则,不是。

python

def is_anagram_sort(s1, s2):


return sorted(s1) == sorted(s2)


四、哈希表法

哈希表法是一种高效的方法。我们可以使用一个哈希表(字典)来统计字符串中每个字符的出现次数,然后比较两个字符串的哈希表是否相同。

python

def is_anagram_hash(s1, s2):


if len(s1) != len(s2):


return False


char_count = {}


for char in s1:


char_count[char] = char_count.get(char, 0) + 1


for char in s2:


if char not in char_count or char_count[char] == 0:


return False


char_count[char] -= 1


return all(count == 0 for count in char_count.values())


五、字符数组法

字符数组法是一种空间复杂度更低的解决方案。我们可以使用一个固定大小的数组来统计字符串中每个字符的出现次数,因为英文字母只有26个。

python

def is_anagram_array(s1, s2):


if len(s1) != len(s2):


return False


char_count = [0] 26


for i in range(len(s1)):


char_count[ord(s1[i]) - ord('a')] += 1


char_count[ord(s2[i]) - ord('a')] -= 1


return all(count == 0 for count in char_count)


六、性能分析

1. 排序法的时间复杂度为O(nlogn),空间复杂度为O(1)。

2. 哈希表法的时间复杂度为O(n),空间复杂度为O(1)。

3. 字符数组法的时间复杂度和空间复杂度均为O(n)。

在实际应用中,哈希表法和字符数组法是更优的选择,因为它们的时间复杂度更低。

七、总结

本文以LeetCode中的字母异位词问题为例,介绍了排序法、哈希表法和字符数组法三种解决方案,并对它们的性能进行了分析。通过学习这些方法,读者可以更好地理解和掌握数据结构与算法在解决实际问题中的应用。

八、扩展阅读

1. 《算法导论》

2. 《数据结构与算法分析》

3. LeetCode官方文档

通过不断学习和实践,相信读者能够在这个领域取得更大的进步。