题目:单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 :
输入: s = "leetcode", wordDict = ["leet", "code"],输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
输入: s = "applepenapple", wordDict = ["apple", "pen"],输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。注意你可以重复使用字典中的单词。
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"],输出: false
-------------------------------------------------------------------------------
思路:典型的动态问题。按照“爬楼梯”问题的解法处理,设置0和1的位置判断。
解法1:
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
# 为空校验
if not s or not wordDict:
return False
# 设置最大步长为wordDict中最长的单词长度
max_stride = max([len(word) for word in wordDict])
res = [0]*(len(s)+1)
# 设置初始元素为1,其他为0
res[0] = 1
for i in range(1, len(s)+1):
for j in range(i-max_stride, i):
if res[j] == 1 and s[j:i] in wordDict:
res[i] = 1
# 如果最后一个元素为1,表示能到达最后一个字符,即可以拼接
if res[-1] == 1:
return True
else:
return False
解法2:解法1的变种
class Solution:
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
dp = [True]
lenght = len(s)
i = 1
while i < lenght + 1:
dp.append(False)
j = i - 1
while j >= 0:
if dp[j] and s[j:i] in wordDict:
dp[i] = True
break
j -= 1
i += 1
return dp[len(s)]
参考:
https://blog.csdn.net/weixin_41303016/article/details/88320907
https://blog.csdn.net/weixin_42771166/article/details/85320822