python算法习题(五):单词拆分

1. 题目

给一字串s和单词的字典dict,在字串中增加空格来构建一个句子,并且所有单词都来自字典。
返回所有有可能的句子。
样例:
给一字串lintcode,字典为[“de”, “ding”, “co”, “code”, “lint”]
则结果为[“lint code”, “lint co de”]。

2. 思路

a. 使用排列组合算法得出所有拆分情况,再判断每一项是否在给定字典里面。
b. 截取前N段在给定字典里面的单词,然后如此循环查找剩下部分。这种方法容易漏选。
综合考虑使用A计划。

3. 代码

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']

4. 总结

数据量不大的时候穷举法使用起来真是简单粗暴!issubset适用于子集合的判断,不需要再一个一个地去查找判断。

你可能感兴趣的:(python,算法学习)