classTrieNode:def__init__(self):
self.isWord =False
self.children =[Nonefor _ inrange(26)]classTrie:def__init__(self):
self.root = TrieNode()# 将dic中的单词倒序插入字典树definsert(self,word):
cur = self.root
for i inrange(len(word)-1,-1,-1):
c =ord(word[i])-ord('a')if cur.children[c]==None:
cur.children[c]= TrieNode()
cur = cur.children[c]
cur.isWord =True# 找到 sentence 中以 endPos 为结尾的单词,返回这些单词的开头下标。defsearch(self,word,endPos):
indices =[]
cur = self.root
for i inrange(endPos,-1,-1):
c =ord(word[i])-ord('a')if cur.children[c]==None:break
cur = cur.children[c]if cur.isWord:
indices.append(i)return indices
classSolution:defrespace(self, dictionary: List[str], sentence:str)->int:"""
# 使用动态规划
# dp数组表示以当前元素结尾的最小未匹配数
n = len(sentence)
dp = [0]*(n+1)
for i in range(1,n+1):
# 未匹配的情况
dp[i] = dp[i-1]+1
# 查找当前字符之前以idx开始的字符串是否在字典中,如果在,就更行dp数组
for idx in range(0,i):
if sentence[idx:i] in dictionary:
dp[i] = min(dp[i],dp[idx])
return dp[n]
"""# 法二,使用字典树,字典树是逆序构造
trie = Trie()for word in dictionary:
trie.insert(word)
n =len(sentence)
dp =[0]*(n+1)for i inrange(1,n+1):
dp[i]= dp[i-1]+1for idx in trie.search(sentence,i-1):
dp[i]=min(dp[i],dp[idx])return dp[n]