题目链接:https://leetcode.cn/problems/replace-words/
思路
方法:哈希匹配
直观想法
将字符串数组中的所有字符串存入哈希表中,遍历sentence中的所有单词,从短到长遍历单词前缀,对比哈希表中的单词是否存在,存在则替换。
算法
1.将dictionary字符串数组中的所有字符串存入哈希表mps中
2.用strings.Split方法以空格为分隔符,将单词分割成字符串数组,遍历数组
1) 从短到长匹配哈希表中,找到单词的最短词根,将单词替换
3.用strings.Join方法将字符串数组以空格为分隔符拼接回来
代码示例
func replaceWords(dictionary []string, sentence string) string { mps := map[string]bool{} for i := range dictionary{ mps[dictionary[i]] = true } str := strings.Split(sentence, " ") for i := range str{ for j := 1; j <= len(str[i]); j++{ if mps[str[i][:j]] == true{ str[i] = str[i][:j] break } } } return strings.Join(str, " ") }
复杂度分析
- 时间复杂度:O(n + ∑wi2) 其中n表示dictionary的单词数量,构建哈希集合消耗 O(n)时间,wi是 sentence 分割后第 ii 个单词的字符数,判断单词的前缀子字符串是否位于哈希集合中消耗 O(wi2)
- 空间复杂度:O(n + s) 其中n表示dictionary的单词数量,构建哈希集合消耗 O(n)空间,s表示 sentence 分割的出来的单词数量,消耗O(s)的空间