我正在用leetcode解决Word Break II。
https://leetcode.com/problems/word-break-ii/description/
给出一个非空字符串s和一个包含非空单词列表的字典wordDict,在s中添加空格以构成一个句子,其中每个单词都是一个有效的字典单词。返回所有可能的句子。
注意:
在分割中,字典中的同一单词可以重复使用多次。 您可能会认为字典中没有重复的单词。
Input:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
Output:
[
"pine apple pen apple",
"pineapple pen apple",
"pine applepen apple"
]
Explanation: Note that you are allowed to reuse a dictionary word.
我得到了递归解决方案,但是我在迭代解决方案上苦苦挣扎。主要是,解决方案是正确的,但leetcode具有病理情况,并且如果没有备忘,它将失败。我通过递归版本通过了leetcode实践,但是我不能放弃迭代解决方案。但是我找不到做记忆的好地方。感谢您的建议。
以下是两种解决方案:
def inverse_iterative(s, wdict):
st = []
ans = []
for w in wdict:
if s.startswith(w):
if len(s) == len(w):
ans.append(w)
return ans
st.append((w, 0, [w]))
while st:
cur_w, cur_idx, cur_list = st.pop()
cur_start = cur_idx + len(cur_w)
for w in wdict:
if not s[cur_start:].startswith(w):
continue
if len(w) == len(s[cur_start:]):
ans.append(' '.join(cur_list+[w]))
else:
st.append((w, cur_start, cur_list+[w]))
return ans
def inverse_helper(s, wdict, memo):
if s in memo:
return memo[s]
if not s:
return []
res = []
for word in wdict:
if not s.startswith(word):
continue
if len(word) == len(s):
res.append(word)
else:
result_of_rest = helper(s[len(word):], wordDict, memo)
for r in result_of_rest:
r = word + ' ' + r
res.append(r)
memo[s] = res
return res