和上一题一样,可以遍历输入字符串的所有后缀,从最小的后缀开始,并且记录该后缀
的所有合法“分词”(例如:‘leetcode’可以被分为‘leet code’,并且leet 和code在给定字典['leet','code']中都是合法单词,那么这是一个valid分词)
具体算法和14题大体一致:
使用一个字典保存中间记录tmp
遍历所有后缀,按照长度,从最小后缀开始遍历:
对当前后缀suffix,遍历其前缀集合,按照长度顺序遍历:
如果当前前缀是给定字典中合法单词,
如果该前缀对应后缀为空,即已经到了当前suffix末尾,tmp字典中加入[前缀]
如果不为空,找出之前tmp字典中的记录result=tmp[前缀对应后缀],将前缀依次插入result的各个item中。
算法循环结束后,tmp[s]即是所求。
代码如下:
class Solution:
# @param s,a string
# @param dict, a set of string
# @return a boolean
def wordBreak(self,s,dict_):
import copy
# assume is is not None
if len(s)== 0:
if s in dict_:
return True
return False
def copy(l):
ret = []
for item in l:
tmp=[]
for i in item:
tmp.append(i)
ret.append(tmp)
return ret
tmp_result = {}
for i in xrange(len(s)-1,-1,-1):
suffix = s[i:]
tmp_result[suffix]=[]
for j in xrange(1,len(suffix)+1):
prefix = suffix[:j]
if prefix in dict_:
# The whole word is in dict_
if suffix[j:]=='':
tmp_result[suffix].append([prefix])
else:
result = tmp_result[suffix[j:]]
result = copy.deepcopy(result)
map(lambda x:x.insert(0,prefix),result)
tmp_result[suffix].extend(result)
return map(lambda x:' '.join(x),tmp_result[s])
def test_solution():
ss = Solution()
s='aaaaaaa'
d = ['aaaa','aaa']
set_ = set(d)
print ss.wordBreak(s,d)
if __name__ == '__main__':
test_solution()
注意这里自定义了copy函数,因为tmp_result中保存的是引用,所以更新tmp的内容的时候,不同key的值之间会有干扰,也可以使用copy模块。