这道题大概是说给定一个字符串,以及一个字符串的字典(集合),问字符串是不是可以由字典中的字符串组合而成:
一个例子是:字符串s=‘leetcode’,字典d=['leet','code'].这个时候字符串s可以用字典中的字符串组合而成。
观察之后得到的思路是:假设字符串s长度为l,那么这个字符串就有l个前缀,那么遍历这些前缀。
1首先判断字符串当前前缀,是不是在字典中
如果该前缀在字典中,递归判断与该前缀对应的后缀是否可以使用字典组合表示
如果该前缀对应后缀可以使用字典组合表示,则当前字符串可以使用字典组合表示,返回true
如果判断为否,continue循环。
2上面循环如果结束,字符串的所有前缀及其对应后缀都不能使用字典中字符串组合而成。返回false。
然而这个算法时间复杂度很高。使用公式表示如下:
f(n)=f(n-1)+f(n-2)...f(1)
数学不好,但可以想象应该是指数级别。
再仔细观察可以看出,使用上面递归方法,某些后缀字符串被大量重复计算。是不是可以首先机选后缀,然后保存起来呢?
所以得到以下方法:
字符串s的后缀集合set(s长度为l,则set秩为l),从最短的后缀开始,顺序遍历集合
使用一个字典tmp_d:某个后缀为key,是否可以由输入字典中字符串组合而成为val,是bool型。
对当前后缀suffix
遍历它的所有前缀:
如果当前前缀在字典中:
当前前缀在suffix中的后缀在tmp_d为真,则tmp_d[suffix]=True
break 循环
如果循环结束,但是tmp_d中仍然没有suffix,则设其为false。
代码为:
class Solution:
# @param s, a string
# @param dict, a set of string
# @return a boolean
def wordBreak(self, s, dict_):
# assume is is not None
if len(s)== 0:
if s in dict_:
return True
return False
tmp_result = {}
for i in xrange(len(s)-1,-1,-1):
suffix = s[i:]
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]=True
break
else:
result = tmp_result[suffix[j:]]
if result:
tmp_result[suffix]=True
break
if not suffix in tmp_result:
tmp_result[suffix] = False
return tmp_result[s]