- [Leetcode 3213. Construct String with Minimum Cost](#Leetcode 3213. Construct String with Minimum Cost)
- [1. 解题思路](#1. 解题思路)
- [2. 代码实现](#2. 代码实现)
1. 解题思路
这一题的话思路上还是比较直接的,就是一个trie树加一个动态规划,通过trie树来快速寻找每一个位置作为起点时能够匹配的全部字符串,然后用一个动态规划来获取最优剪切方案。
其中,关于trie树的内容可以参考我之前的博客《经典算法:Trie树结构简介》,这里就不过多展开了。
然后当前的实现其实还蛮暴力的,时间上勉勉强强通过了全部测试样例,不过应该可以通过剪枝以及优化trie树内的内容来进行一下优化,有兴趣的读者可以考虑一下其具体实现,这里就不过多进行展开了。
2. 代码实现
给出python代码实现如下:
python
class Trie:
def __init__(self):
self.trie = {}
def add_word(self, word, cost):
trie = self.trie
for c in word:
trie = trie.setdefault(c, {})
if "eos" not in trie:
trie["eos"] = (word, cost)
elif cost < trie["eos"][1]:
trie["eos"] = (word, cost)
return
def find_all_prefix(self, word):
prefixs = []
trie = self.trie
for c in word:
if c not in trie:
break
trie = trie[c]
if "eos" in trie:
prefixs.append(trie["eos"])
return prefixs
class Solution:
def minimumCost(self, target: str, words: List[str], costs: List[int]) -> int:
trie = Trie()
for word, cost in zip(words, costs):
trie.add_word(word, cost)
n = len(target)
ans = math.inf
@lru_cache(None)
def dp(idx):
nonlocal ans
if idx >= n:
return 0
prefixs = trie.find_all_prefix(target[idx:])
if prefixs == []:
return math.inf
return min(c + dp(idx+len(w)) for w, c in prefixs)
ans = dp(0)
return ans if ans != math.inf else -1
提交代码评测得到:耗时10897ms,占用内存267.2MB。