LeetCode每日一题,面试题17.13. Re-Space LCCI
先看题目描述
大意就是给定 sentence 和 dictionary,依赖 dictionary 来识别单词,让我们返回 sentence 中未识别的字符数
算法和思路
第一反应就是动态规划
- 初始化 dp[0] = 0,dp[i + 1] 表示子串 sentence[0: i] 中未识别的字符个数
- 状态转移方程:若 dictionary 中存在子串 sectence[j: i],dp[i + 1] = min(dp[i + 1], dp[j]),否则 dp[i + 1] = dp[i] + 1
算法源码
1 | import java.util.Arrays; |
然后提交上去就超时了,而且不知道怎么改善运行时间,毫无头绪。后来看了题解才知道可以使用字典树 Trie 来优化查找,Trie 是一种最大程度利用多个字符串前缀信息的数据结构,它可以在 O(w) 的时间复杂度内判断一个字符串是否是一个字符串集合中某个字符串的前缀,其中 w 代表字符串的长度
1 | import java.util.*; |
感觉解这道题的关键就在于如何快速判断当前子串是否存在于字典中,而使用字典树 Trie 就可以优化查找,需要掌握字典树 Trie 这种数据结构