动态规划 —— 子数组系列-单词拆分

1. 单词拆分

题目链接:

139. 单词拆分 - 力扣(LeetCode)https://leetcode.cn/problems/word-break/description/


2. 算法原理

状态表示:以某一个位置为结尾或者以某一个位置为起点

dp[i]表示:在[0,i]区间里的字符串,能否被字典中的单词拼接而成

如果可以拼接而成那么里面存储的是一个true,如果不能拼接而成那么里面存储的是一个false

这里可以看出本题是一个bool类型的值


2. 状态转移方程:根据最后一个位置来划分问题

本题最后一个位置就是最后一个单词,要么就是最后一个字符来构成最后一个单词,要么就是最后两个字符来构成最后一个单词.....,要么是整个字符串构成最后一个单词

我们可以将整个区间划分为俩部分:前面的那一部分能够拼接而成并且后面的那一部分是在字典中,那么整个的字符串就能够拼接而成

那么这样的话我们就可以设一个j,j表示最后一个单词起始位置的下标 0 < j < i

dp[i]分为两种情况:1. dp[j - 1] ==true && s(j~i)是否在字典中

2. false
3. 初始化把dp表填满不越界,让后面的填表可以顺利进行

这里我们需要 加上一个虚拟节点,因为如果是 整个字符串构成最后一个单词的情况的话,那么j - 1 就会越界

教给大家一个关于字符串类型题目的下标映射解决方法,我们可以在原字符串前面加上一个新的字符(随便什么,一般是空格),然后再赋值给字符串,这个时候就相当于原字符串是从1开始计数,就不用再统一往后移一位了


4. 填表顺序

本题的填表顺序是:从左往右

5. 返回值 :题目要求 + 状态表示

本题的返回值是:dp[n]


3. 代码

动态规划的固定四步骤:1. 创建一个dp表

2. 在填表之前初始化

3. 填表(填表方法:状态转移方程)

4. 确定返回值

复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        //将字典中的单词全部插入到哈希表里
        unordered_set<string>hash;
        for(auto& s :wordDict) hash.insert(s);

        int n=s.size();
        vector<bool>dp(n+1);

        //初始化
        dp[0]=true;
        s=' '+s;

        //填表
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j>=1;j--)//j表示最后一个单词起始位置的下标
            {
                if(dp[j-1] && hash.count(s.substr(j,i-j+1)))//判断字串是否在字典中
                {
                    dp[i]=true;
                    break;
                }
            }
        }
        return dp[n];
    }
};

未完待续~

相关推荐
wefg16 分钟前
【算法】动态规划
算法·动态规划
机器学习之心15 分钟前
198种组合算法+优化TCN-Transformer+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
深度学习·算法·transformer·shap分析·新数据预测
狐5717 分钟前
2026-01-12-LeetCode刷题笔记-1266-访问所有点的最小时间.md
笔记·算法·leetcode
Gorgous—l17 分钟前
数据结构算法学习:LeetCode热题100-栈篇(有效的括号、最小栈、字符串解码、每日温度、柱状图中最大的矩形)
数据结构·学习·算法
小郭团队18 分钟前
教育公平的探索
大数据·人工智能·嵌入式硬件·算法·硬件架构
瑞雨溪22 分钟前
力扣题解:740.删除并获得点数
算法·leetcode·职场和发展
LeeeX!24 分钟前
基于YOLO11实现明厨亮灶系统实时检测【多场景数据+模型训练、推理、导出】
深度学习·算法·目标检测·数据集·明厨亮灶
红队it26 分钟前
【Spark+Hadoop】基于spark+hadoop游戏评论数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
大数据·hadoop·分布式·算法·游戏·数据分析·spark
程序员-King.26 分钟前
day125—二分查找—寻找峰值(LeetCode-162)
算法·leetcode·职场和发展
qianbo_insist27 分钟前
基于APAP算法的图像和视频拼接
算法·数学建模·图像拼接