给一字串s和单词的字典dict,在字串中增加空格来构建一个句子,并且所有单词都来自字典。
返回所有有可能的句子。
样例:
给一字串lintcode,字典为[“de”, “ding”, “co”, “code”, “lint”]
则结果为[“lint code”, “lint co de”]。
a. 使用排列组合算法得出所有拆分情况,再判断每一项是否在给定字典里面。
b. 截取前N段在给定字典里面的单词,然后如此循环查找剩下部分。这种方法容易漏选。
综合考虑使用A计划。
from itertools import combinations
def indexCombinations(s):
ret = []
for i in range(1, len(s)):
index_combs = combinations([i for i in range(1,len(s)-1)], i) # 获取拆分为i段的下标组合
ret.extend(index_combs)
return ret
def wordBreak(words, dt):
res = []
for item in indexCombinations(words):
current = 0
tmp = []
for i in item:
tmp.append(words[current:i]) # 获取每一段
current = i
tmp.append(words[current:]) # 收尾
if set(tmp).issubset(set(dt)): # 判断是否在给定字典里面。set函数去重导致的问题不大
res.append(' '.join(tmp))
return res
print(wordBreak('lintcode', ["de", "ding", "co", "code", "lint", "lin", 'tco']))
结果:
['lint code', 'lin tco de', 'lint co de']
数据量不大的时候穷举法使用起来真是简单粗暴!issubset适用于子集合的判断,不需要再一个一个地去查找判断。