【LeetCode 热题 HOT 100】139. 单词拆分【中等】

简介: 【LeetCode 热题 HOT 100】139. 单词拆分【中等】

1. 题目链接

139. 单词拆分【中等】

2. 题目简介

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

说明:

  • 拆分时可以重复使用字典中的单词。
  • 你可以假设字典中没有重复的单词。

示例 1:

输入: S = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

3. 题目分析

  • 题目可简化为:给你一些字符串,这些字符串可不可以拼成目标S并且字符串可以重复使用
  • 可见该问题为一个完全背包问题,对于完全背包来说,我们有一个模板:外层为我们的目标S,内层为我们的选择的东西
  • 我们来看这道题的转移方程,我们定义dp数组:boolean[] dp = new boolean[s.length() + 1];dp[i] 代表 0 ~ i 的字符串可以被拼接,我们想一想,假如 dp[i] 的字符串可以被拼接,那我们 dp[i + 1, len] 也能被拼接的话,是不是代表该 S 字符串拼接成功。
  • 所以,我们的转移方程为:dp[i] = dp[j] && check[j, i-1]
if(dp[j] && check(j, i)){
  dp[i] = true;
  break;
}

4. 题目代码

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int len = s.length();
        boolean[] dp = new boolean[len + 1];
        // 去重 可哈希搜索
        Set<String> set = new HashSet(wordDict);
        if(len == 1){
            return set.contains(s);
        }
        // 0这个位置肯定是可以被搜索到的
        dp[0] = true;
        for(int i = 1; i <= len; i++){
            for(int j = 0; j < i; j++){
                if(dp[j] && set.contains(s.substring(j, i))){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[len];
    }
}


相关文章
|
6月前
LeetCode 热题100——单调栈
LeetCode 热题100——单调栈
59 0
|
6月前
|
人工智能 BI
力扣561 数组拆分
力扣561 数组拆分
|
3月前
|
Python
【Leetcode刷题Python】343. 整数拆分
LeetCode 343题 "整数拆分" 的Python解决方案,使用动态规划算法来最大化正整数拆分为多个正整数之和的乘积。
27 0
|
6月前
leetcode代码记录(整数拆分
leetcode代码记录(整数拆分
52 0
|
6月前
|
算法
leetcode热题100.三数之和
leetcode热题100.三数之和
37 1
|
6月前
|
vr&ar
leetcode热题100.路径总和 III
leetcode热题100.路径总和 III
41 1
|
6月前
|
机器学习/深度学习 算法 索引
leetcode热题100.两数之和
leetcode热题100.两数之和
37 1
|
6月前
|
存储 算法
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
|
6月前
|
网络协议
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
|
6月前
《LeetCode 热题 HOT 100》—— 两数相加
《LeetCode 热题 HOT 100》—— 两数相加