LeetCode 648 单词替换题解
LeetCode 648 单词替换题解
题目描述
题目链接
在英语中,我们有一个叫做「词根」的概念,可以缩短其他单词的长度。给定一个词典和一句话,将句子中的所有单词用其最短匹配词根替换。
解题思路
哈希表 + 前缀匹配法
- 预处理词典:将词典存入哈希表实现O(1)查找
- 最短匹配优先:对每个单词检查所有可能前缀
- 动态替换:找到第一个匹配的前缀立即替换
代码实现
from typing import Listclass Solution:def replaceWords(self, dictionary: List[str], sentence: str) -> str:# 将词典存入集合实现快速查找(O(1)时间复杂度)root_set = set(dictionary) # 空间复杂度 O(n)# 分割句子为单词列表(O(m)时间复杂度,m为单词数)words = sentence.split()# 遍历每个单词进行替换(O(m*l)时间复杂度,l为单词平均长度)for i in range(len(words)):# 检查所有可能前缀(从最短开始)for j in range(1, len(words[i])): # 注意:词根至少1个字符# 发现匹配立即替换并终止检查if words[i][:j] in root_set:words[i] = words[i][:j]break # 保证替换最短匹配词根# 重新组合为句子(O(m)时间复杂度)return ' '.join(words)
if __name__ == "__main__":# 测试用例test1 = Solution().replaceWords(["cat", "bat", "rat"], "the cattle was rattled by the battery") # "the cat was rat by the bat"test2 = Solution().replaceWords(["a", "b", "c"], "aadsfasf absbs bbab cadsfafs") # "a a b c"print(test1) # 输出:"the cat was rat by the bat"print(test2) # 输出:"a a b c"