LeetCode 648 单词替换题解
题目描述
在英语中,我们有一个叫做「词根」的概念,可以缩短其他单词的长度。给定一个词典和一句话,将句子中的所有单词用其最短匹配词根替换。
解题思路
哈希表 + 前缀匹配法
- 预处理词典:将词典存入哈希表实现O(1)查找
- 最短匹配优先:对每个单词检查所有可能前缀
- 动态替换:找到第一个匹配的前缀立即替换
代码实现
python
from typing import List
class 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"