题目描述:
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例:
输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。
思路:
字典中的单词是否可以拼成s字符串,字典中单词可重复使用。这也就是说我们s字符串分割之后,所有的单词都必须在字典里可以找得到,但字典里的单词不一定全部都用得上。我们使用动态规划的方法解决,dp[i]表示字符串s[:i]能否拆分成符合要求的子字符串。我们可以看出,如果s[j:i]在给定的字符串组中,且dp[j]为True(即字符串s[:j]能够拆分成符合要求的子字符串),那么此时dp[i]也就为True了。按照这种递推关系,我们就可以判断目标字符串能否成功拆分。
class Solution:
def wordBreak(self, s, dictionary):
length_s = len(s)
length_d = len(dictionary)
dp = [0]*length_s
for i in range(length_s):
for j in range(length_d):
l = len(dictionary[j])
if l <= i + 1 and dictionary[j] == s[i+1-l: i+1] and (i + 1 == l or dp[i-l] == 1):
dp[i] = 1
break
return dp[-1] == 1
a = Solution()
s = "leetcode"
wordDict = ["leet", "code"]
print(a.wordBreak(s, wordDict))