前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 0139. 单词拆分[动态规划详解]

LeetCode 0139. 单词拆分[动态规划详解]

原创
作者头像
Yano_nankai
修改2021-04-12 10:58:42
4780
修改2021-04-12 10:58:42
举报
文章被收录于专栏:二进制文集二进制文集

题目描述

题目链接

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

代码语言:txt
复制
拆分时可以重复使用字典中的单词。
代码语言:txt
复制
你可以假设字典中没有重复的单词。

示例 1:

代码语言:txt
复制
输入:s = "leetcode", wordDict = ["leet", "code"]
输出:true
解释:返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:

代码语言:txt
复制
输入:s = "applepenapple", wordDict = ["apple", "pen"]
输出:true
解释:返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
     注意你可以重复使用字典中的单词。

示例 3:

代码语言:txt
复制
输入:s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出:false

解题思路

此题可以使用 dfs 求解,但是会超时。

定义 dpi 为从 0 到 i,是否能用 wordDict 表示。

状态转移方程为:dpi = dpj & wordSet.contains(s.substring(j + 1, i + 1))

代码

代码语言:txt
复制
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        boolean[] dp = new boolean[s.length()];
        Set<String> wordSet = new HashSet<>(wordDict);
        for (int i = 0; i < s.length(); i++) {
            for (int j = 0; j <= i; j++) {
                if (wordSet.contains(s.substring(0, i + 1))) {
                    dp[i] = true;
                    break;
                }
                if (dp[j] && wordSet.contains(s.substring(j + 1, i + 1))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length() - 1];
    }
}

复杂度分析

  • 时间复杂度:记字符串 s 的长度是 n,则复杂度是 O(n^2)
  • 空间复杂度:O(n)

GitHub LeetCode 项目

项目 GitHub LeetCode 全解,欢迎大家 star、fork、merge,共同打造最全 LeetCode 题解!

Java 编程思想-最全思维导图-GitHub 下载链接,需要的小伙伴可以自取~!!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解题思路
  • 代码
  • 复杂度分析
  • GitHub LeetCode 项目
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档