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

1.题目解析

题目来源:139.单词拆分------力扣

测试用例

2.算法原理

1.状态表示

创建dp表,dp[i]表示:以第i个位置为结尾前面的字符串是否可以使用字典中的单词拼凑而成

所以dp表存储的是bool类型的数据

2.状态转移方程

这里的状态转移方程不是很重要,重要的是如何判断一个字符串是否可以使用字典中的单词拼凑而成,这里的思路就是首先使用i向后移动遍历字符串每个长度的子数组,使用j指针从i位置向前移动,判断区间[1,j-1]以及[j,i]这两个区间是否都可以被字典中的单词拼凑出来,是则将dp[i]置为true

3.初始化

开辟一个虚拟节点置为true,不会影响填表顺序也可以直接在循环内初始化

4.填表顺序

从左到右

5.返回值

返回最后一个位置的dp表的值

3.实战代码

cpp 复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) 
    {
        int n = s.size();
        unordered_set<string> hash;
        for(auto& e : wordDict)
        {
            hash.insert(e);
        }
        s = ' ' + s;

        vector<bool> dp(n+1);
        dp[0] = true;

        for(int i = 1;i <= n;i++)
        {
            for(int j = i;j >= 1;j--)
            {
                if(dp[j-1] && hash.count(s.substr(j,i-j+1)))
                {
                    dp[i] = true;
                }
            }
        }
        return dp[n];
    }
};
相关推荐
LYFlied36 分钟前
【每日算法】LeetCode 153. 寻找旋转排序数组中的最小值
数据结构·算法·leetcode·面试·职场和发展
唐装鼠37 分钟前
rust自动调用Deref(deepseek)
开发语言·算法·rust
Lucas555555551 小时前
现代C++四十不惑:AI时代系统软件的基石与新征程
开发语言·c++·人工智能
qcwl661 小时前
操作系统 真象还原 学习笔记#13
笔记·学习
车载测试工程师1 小时前
CAPL学习-CAN相关函数-概述
网络协议·学习·capl·canoe
roman_日积跬步-终至千里1 小时前
【人工智能导论】08-学习-如何让计算机理解序列数据——用RNN/LSTM建模时序依赖,用文本嵌入表示序列元素
人工智能·rnn·学习
m0_689618281 小时前
30 分钟打印!多材料3D打印软机器人内置驱动 + 自主避障
笔记·学习·机器人
ytttr8732 小时前
MATLAB基于LDA的人脸识别算法实现(ORL数据库)
数据库·算法·matlab
_MyFavorite_2 小时前
cl报错+安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
charlie1145141912 小时前
现代嵌入式C++教程:C++98——从C向C++的演化(2)
c语言·开发语言·c++·学习·嵌入式·教程·现代c++