题目:原题链接(中等)
标签:字典树、递归、动态规划、字符串
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
Ans 1 (Python) | O ( D + N 2 ) | O ( D + N ) | 232ms (92.47%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
class Solution:
def respace(self, dictionary: List[str], sentence: str) -> int:
if not sentence:
return 0
# 构造字典树
tree = {}
for word in dictionary:
node = tree
for ch in word:
if ch not in node:
node[ch] = {}
node = node[ch]
node["@"] = None
size = len(sentence)
# 计算每个位置开始的所有可能的结尾位置
maybe = [[] for _ in range(size + 1)]
for i in range(size):
j = i
node = tree
while j < size and sentence[j] in node:
node = node[sentence[j]]
j += 1
if "@" in node:
maybe[i].append(j)
print([(i, lst) for i, lst in enumerate(maybe)])
# 计算最小未识别字符数量
dp = [float("inf") for i in range(size + 1)]
def track(idx, now):
# 如果匹配结束则跳过
if idx == size + 1:
return
# 如果当前情况不是最优解,则跳过
if now >= dp[idx]:
return
dp[idx] = now
# 处理发现单词的各种情况
for end in maybe[idx]:
# print(idx, "->", end, "=", now)
track(end, now)
# 处理不发现这个位置开始的单词的情况
track(idx + 1, now + 1)
track(0, 0)
# print([(i, d) for i, d in enumerate(dp)])
return dp[-1]