模版题-动态规划-单词拆分( 完全背包 )
**形如用物品装满背包的问题,优先考虑背包问题。**
物品可以是数字,可以是字符串;背包可以是容量,也可以是字符串。
总之,形如用某物填充/装满某物的问题,优先考虑背包解决。
```python
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
# 完全背包
# 用wordDict内的物品组装成s —— 典型背包问题
# 注意: 物品的顺序不同组成的单词不同,所以应当是按照排列的方式确认是否可以拼成s。
# dp[ i ]表示s[ 0:i+1 ]是否可以用wordDict拼成 ( 左闭右开区间 )
n = len( s )
dp = [ False for _ in range( n + 1 ) ]
dp[ 0 ] = True # s[ 0:1 ]="",不选任何物品可可形成
for i in range( 1, n + 1 ):
for v in wordDict:
len_v = len( v )
if i - len_v >= 0:
# 若选v, 需要确定s[ i - len( v ): i + 1 ]是否和v相同
flag = True
for j in range( len_v ):
if v[ j ] != s[ i - len_v + j ]:
flag = False
break
dp[ i ] = dp[ i ] or ( dp[ i - len( v ) ] and flag )
return dp[ n ]
```