139. 单词拆分 Python

文章目录

  • 一、题目描述
      • 示例 1
      • 示例 2
      • 示例 3
  • 二、代码
  • 三、解题思路


一、题目描述

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
     注意,你可以重复使用字典中的单词。

示例 3

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

提示:
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s 和 wordDict[i] 仅有小写英文字母组成
wordDict 中的所有字符串 互不相同

二、代码

代码如下:

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        # 新建一个长度为字符串长度+1的判断数组,其中多出来的最后一位为最终答案
        flag = [False for i in range(len(s) + 1)]
        # flag[i] 表示 长度为i 的字符串能否由字典构成 
        # 令开始字符串为 True ,长度为空的字符不用管。
        flag[0] = True 
        for i in range(1, len(s) + 1):  # 遍历字符串
            for j in range(i):  # 遍历字典
                # 如果 判断符为True 且 当前字符串(s[j:i])在字典中,则
                if flag[j] and s[j:i] in wordDict:  
                    flag[i] = True
                    break  
        print(flag[len(s)])
        return flag[len(s)]

三、解题思路

本题如果采用普通的回溯方法去全部遍历所有可能的字符串组合情况,则会导致超出时间限制,故可以采用动态规划方法进行求解,具体思路如下:
①构建一个长度为 字符串长度+1 的 判断数组flag(默认值全为False),其中flag[i]的定义为:长度为i的字符串能否由字典构成。则我们最后只需要判断 长度为字符串长度(即flag[len(s)])的flag是否为True即可;另外,长度为0时我们设置flag为True(即flag[0]=True)
②我们从第二2个字符开始遍历字符串s,判断该字符串中是否存在能被字典构成的字符串,如果长度为i的字符串能由字典构成,则令当前对应的flag为True
③循环遍历直到最后一个字符,返回flag数组的最后一个结果即可。

你可能感兴趣的:(LeetCode中等难度题集,python,算法,开发语言)