Given a
non-empty string
s and a dictionary
wordDict containing a list of
non-empty words, determine if
s can be segmented into a space-separated sequence of one or more dictionary words. You may assume the dictionary does not contain duplicate words.
For example, given
s = "leetcode"
,
dict = ["leet", "code"]
.
Return true because "leetcode"
can be segmented as "leet code"
.
思路:使用动态规划,子问题为从s[0]开始的更短的子列能否分割。用bool[i]来保存长度为i的子列是否可以分割。可以分割的条件是最后一个分割线画在子列的末端。我们先看第一次画分割线能不能直接画在子列的末端,若能,则bool保存true,若不能,则子列中能画分割线使得分割线左面和右面均在dict中的地方添加分割线,若最终能满足子列可以分割,保存true,否则该子列不能分割,保存false。这样就列出所有子列可以画分割线的地方,s的分割线必定出现在s的结尾以及s子列的分割线处。最终bool的最后一项就是我们需要的结果。
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
bool = [False]
bool = bool * len(s)
i = 0
while i < len(s):
if s[0 : i + 1] in wordDict:
bool[i] = True
else:
j = 0
while j < i:
if bool[j] and s[j + 1 : i + 1] in wordDict:
bool[i] = True
j += 1
i += 1
return bool[len(s) - 1]