前置知识回顾
在之前的学习中,我们针对 Java 中的 HashMap、HashSet,以及 Python 中的 dict 和 set 进行了分类梳理。虽然不同语言的具体实现细节有所差异,但在核心用法上大同小异。通过表格总结了常用方法与场景后,我们结合两道题目初步掌握了这类题型的解题思路。
今天,我们将在此基础上进一步深入,熟悉哈希表在实际算法中的应用技巧。
题目一:外星词典
难度:简单
描述: 某种外星语使用英文小写字母,但字母表的顺序(order)可能不同。给定一组用外星语书写的单词 words,以及其字母表的顺序 order,判断给定的单词是否按该语言的字典序排列。
示例:
- 输入:words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"
- 输出:true
- 解释:在该语言的字母表中,'h' 位于 'l' 之前,所以单词序列是按字典序排列的。
分析: 这道题的核心在于自定义比较规则。我们需要根据给定的 order 字符串,确定每个字符的优先级。
- 建立映射:既然涉及哈希表专题,我们可以利用哈希表快速获取字符的排序下标,替代 ASCII 码或数组模拟。
- 逐位比较:参考冒泡排序的思想,两两比较相邻单词。如果
left < right且right < next,则整体有序。 - 边界处理:如果遇到
left[index] > right[index],直接返回 false;如果left[index] < right[index],说明当前位已决定大小,后续无需比较,break 进入下一对单词的比较。 - 长度不足:若一个单词是另一个的前缀,较短的单词应排在前面。例如 "apple" 和 "app","app" 更短,应排在前面。
代码实现:
Python:
class Solution:
def isAlienSorted(self, words: List[str], order: str) -> bool:
dic = {j: i for i, j in enumerate(order)}
for i in range(len(words) - 1):
w1, w1_len = words[i], len(words[i])
w2, w2_len = words[i + 1], len(words[i + 1])
for idx in ((w1_len, w2_len)):
w1_idx = - idx >= w1_len dic[w1[idx]]
w2_idx = - idx >= w2_len dic[w2[idx]]
w1_idx > w2_idx:
w1_idx < w2_idx:


