首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >跟着leedcode刷算法 -- 字符串2

跟着leedcode刷算法 -- 字符串2

作者头像
玖柒的小窝
修改2021-11-08 09:16:31
修改2021-11-08 09:16:31
34100
代码可运行
举报
文章被收录于专栏:各类技术文章~各类技术文章~
运行总次数:0
代码可运行

题三:

单词拆分

给你一个字符串 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 中的所有字符串 互不相同

相关标签

  • 字典树
  • 记忆化搜索
  • 哈希表
  • 字符串
  • 动态规划

动态规划思路:

  • 对s进行拆分,s[0..j-1]和s[j:i]两个部分,其中j = 0..i-1
  • 判断以上两个部分是否在wordDict中,而s[0..j-1]可以用dp[j]替代

代码:

代码语言:javascript
代码运行次数:0
运行
复制
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [True]+[False for _ in range(len(s))]
        for i in range(1,len(s)+1):
            for j in range(i):
                if dp[j] and s[j:i] in wordDict:
                    dp[i] = True
                    break 
        return dp[len(s)]
复制代码

运行结果:

第四题:

单词拆分 II

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。

说明:

分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1:

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

示例 2:

输入:

s = "pineapplepenapple"

wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]

输出:

[ "pine apple pen apple", "pineapple pen apple", "pine applepen apple" ]

解释: 注意你可以重复使用字典中的单词。

示例 3:

输入:

s = "catsandog"

wordDict = ["cats", "dog", "sand", "and", "cat"]

输出: []

相关标签

  • 字典树
  • 记忆化搜索
  • 哈希表
  • 字符串
  • 动态规划
  • 回溯

这个题和之前的分割回文串思路很像都是dfs算法

话不多说,直接上代码

代码语言:javascript
代码运行次数:0
运行
复制
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:        
        def dfs(n):
            if n == len(s):
                res.append(" ".join(list(items)))
                return
            
            for i in range(n,len(s)):
                if s[n:i + 1] in wordDict:
                    items.append(s[n:i + 1])  
                    dfs(i + 1)
                    items.pop()
        
        res = []
        items = []
        dfs(0)
        return res
复制代码

执行结果:

对比一下分割回文算法:

很多题都很相似,大家可以灵活运用一下

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题三:
    • 单词拆分
  • 第四题:
    • 单词拆分 II
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档