假设我们有一个非空字符串s和一个字典wordDict。那包含一个非空单词的列表,确定何时可以将s分割成一个或多个字典单词的以空格分隔的序列。我们必须遵循一些规则-
字典中的同一单词可以在分割中多次重复使用。
我们可以假设字典中不包含重复的单词。
假设字符串s =“ applepenapple”,并且单词字典类似于[“ apple”,“ pen”],则输出为true,因为字符串s可以分段为“ apple pen apple”。
让我们看看步骤-
定义一个nx n阶的矩阵DP。n =字符串的大小,并使用false对其进行初始化
对于范围1到s长度的i
如果字典中的子字符串s [j至j + 1],则dp [j,j + i-1]:= True
除此以外
如果dp [j,k-1]和dp [k,j + i – 1],则dp [j,j + i – 1]:= True
对于范围j +1至j + i的k
对于0到s长度范围内的j – i
返回DP [0,s的长度-1]
让我们看下面的实现以更好地理解-
class Solution(object): def wordBreak(self, s, wordDict): dp = [[False for i in range(len(s))] for x in range(len(s))] for i in range(1,len(s)+1): for j in range(len(s)-i+1): #print(s[j:j+i]) if s[j:j+i] in wordDict: dp[j][j+i-1] = True else: for k in range(j+1,j+i): if dp[j][k-1] and dp[k][j+i-1]: dp[j][j+i-1]= True return dp[0][len(s) - 1] ob1 = Solution()print(ob1.wordBreak("applepenapple", ["apple", "pen"]))
"applepenapple" ["apple", "pen"]
输出结果
true