Leetcode 139 - Word Break(线性dp)

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01 当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。 阅读详情

题意

给一个字符串S和一个字典wordDict,要求判断是否能用wordDict内的数组成S。

思路

算法1

区间dp,时间复杂度O(n3)

首先将wordDict内的字符串全部丢到unordered_set<string> has里面,方便查看有没有。

状态表示:d[i,j],区间s[i, j]能否用has内的字符串表示。

转移方程:d[i,j]=d[i,k]&&d[k+1,j]

算法2

线性dp,时间复杂度O(n2)

状态表示:d[i],区间s[0, i]能够用has内的字符串表示。

转移方程:

  1. s[0,i]能用has表示:d[i]=1
  2. s[j+1,i]能用has内的字符串表示且d[j]==1:d[i]=1
  3. 其他情况:d[i]=0

代码

//n^3 dp
const int maxn = 1005;

class Solution {
public:
    unordered_map<string, int> has;
    int d[maxn][maxn];
    int dfs(int i, int j, string s) {
        if (i > j) return 0;
        if (d[i][j] != -1) return d[i][j];
        if (has.find(s.substr(i, j - i + 1)) != has.end()) return d[i][j] = 1;
        d[i][j] = 0;
        for (int k = i; k < j; k++) {
            int t1 = dfs(i, k, s), t2 = dfs(k + 1, j, s);
            if (t1 == 1 && t2 == 1) d[i][j] = 1;
            else d[i][j] = 0;
            if (d[i][j] == 1) {
                return d[i][j];
            }
        }
        return d[i][j];
    }

    bool wordBreak(string s, vector<string>& wordDict) {
        if (wordDict.size() == 0) return s == "";
        for (auto x : wordDict) {
            if (has.find(x) == has.end()) has[x] = 1;
        }
        memset(d, -1, sizeof(d));
        return dfs(0, s.size() - 1, s);
    }
};

//n^2 dp
class Solution {
public:
    unordered_set<string> has;
    bool wordBreak(string s, vector<string>& wordDict) {
        if (wordDict.empty()) return s == "";
        for (auto x : wordDict) has.insert(x);
        vector<bool> d(s.length(), 0);
        string t = s.substr(0, 1);
        d[0] = (has.find(t) == has.end() ? 0 : 1);
        for (int i = 1; i < s.length(); i++) {
            string t = s.substr(0, i + 1);
            if (has.find(t) != has.end()) {
                d[i] = true;
                continue;
            }
            for (int j = 0; j < i; j++) {
                if (d[j]) {
                    string tt = s.substr(j + 1, i - j);
                    if (has.find(tt) != has.end()) d[i] = true;
                }
            }
        }
        return d[s.length() - 1];
    }
};
从查表法到实时计算:SimpleFOC库中正弦函数优化的技术演进 本文深入探讨了SimpleFOC库v2.0.1版本中正弦函数优化技术的演进,从传统查表法到实时计算的创新实践。通过定点数优化、对称性利用和分段线性插值等关键技术,实现了在嵌入式电机控制中的高效三角函数计算,显著提升性能和资源利用率。 阅读详情

相关推荐

一篇文章将三极管讲透:三极管从原理到应用,从参数到特性,从入门到精通

晶体三极管(Transistor)是一种半导体电子器件,也是电子工程中最基本的元件之一。它有三个区域,分别是P型半导体,N型半导体和P型半导体,从而形成PNP型晶体三极管或者NPN型晶体三极管。

学习帮的博客 9万+

算法学习-动态规划,纸老虎打倒他(持续更新中)

动态规划(DP)是面试考察的重点和难点,为了能够顺利通过大厂面试中的手撕代码环节,笔者记录了自己对于这个知识点的刷题汇总,希望可以理清思路加深理解,亲身实践,帮大家拿下动态规划。....................................

蒋大钊的博客 968

国产大模型编程能力深度分析报告(2026年5月更新版)

2026年5月国产大模型编程能力报告显示,主流模型迎来重大升级。DeepSeek V4以1.6T参数创性能新高,Qwen3.6-Plus支持原生多模态编程,MiniMax M2.7转向闭源并优化Agent编码,Kimi K2.6成为商业化成熟的主力模型,GLM-5开源并涨价30%。阿里云百炼推出双轨订阅体系,区分团队和个人开发者需求。各模型在参数规模、上下文长度、性能表现和适用场景上各具优势,国产AI编程服务正加速向订阅制转型,成本效益显著提升。

Willin Wang 的全栈升级指南 1654

Prepare50

遍历一次,建一个value为dict,key为下标的dict,每次去里面判断下,要找的数是否存在,时间复杂度O(n),空间负责度O(n)。

liuhe2296044的博客 940

【Stata双重差分模型】双重差分DID的具体操作步骤

本案例将详细阐述如何使用双重差分法进行实证分析,并展示具体的STATA操作代码。

a519573917的博客 2万+

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 185

hot100 python解法合集

因此,数组中的每个数字,最多只会被访问两次(一次是在 for 循环中,一次是在 while 循环中作为后续数字被检查)。所以总操作次数是线性的。这意味着内部的 while 循环只有在找到序列起点时才会执行。只有遍历到 1 时:1-1=0 不存在,进入 while 循环,访问 2, 3, 4。核心:使用**哈希集合(HashSet)**来通过空间换时间。外层的 for 循环遍历集合中的每个元素。遍历到 2:2-1=1 存在,跳过。遍历到 3:3-1=2 存在,跳过。遍历到 4:4-1=3 存在,跳过。

m0_52049533的博客 468

ISO26262 功能安全各个阶段测试要求

1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...

AgingMoon的博客 1万+

Leetcode 494 - Target Sum(01背包)

题意给定一个数组,现在可以在这个数组的每个数之前添加+或者-,求和为S的所有方案数(数组内数不能交换顺序)思路其实,每个数之前添加+或者-,就相当于这个数是选正数还是负数,就一01背包。状态表示:d[i][j]d[i][j],选过第i个数后,和为j的方案数。转移方程:d[i][j]=d[i−1][j−ai]+d[i−1][j+ai]d[i][j] = d[i - 1][j - a_i] + d[i

博客已迁移至:lzed.github.io 1849

c#【保姆级教程】基于System.Text.Json 支持多态类型序列化! 手把手教你实现一个通用的 PolymorphicJsonConverter!

我们需要自己实现一个继承自的转换器,在序列化时记录具体类型,在反序列化时根据类型标识还原成正确的子类对象。public abstract class WorkStepBase { /* 抽象方法等 */ }public class Person : WorkStepBase { /* 实现 */ }public class Product : WorkStepBase { /* 实现 */ }特性说明✅ 自动发现子类无需手动维护类型列表,自动扫描程序集✅ 类名映射。

一个编程的同学 425

块存储:AIO的直接写流程注释

提交io流程中aio_write之前函数的注释,可参考“块存储:AIO的直接读流程注释”。

yiyeguzhou100的专栏 1334

Leetcode 546 - Remove Boxes(区间dp)

题意有一行方块,每个方块有颜色,现在可以把相邻的k个并且颜色相同的方块消除,得分为k⋅kk \cdot k,求最大得分。思路首先,做一步预处理优化时间:将相邻并且颜色相同的方块合并成段,用c[i]c[i]和len[i]len[i]分别记录这个段的颜色和里面的方块数目。于是以下的操作都是针对段进行。状态表示:d[i,j,k]d[i, j, k],区间[i,j][i, j]内,并且jj段之后还有kk个颜

博客已迁移至:lzed.github.io 1439

YOLOv8n轻量化实战:10分钟打通实时摄像头目标检测,附参数调优与避坑指南

本文介绍了如何快速入门YOLOv8目标检测框架,通过摄像头实战实现实时检测。YOLOv8凭借轻量化架构和跨平台优势,是新手入门的理想选择。文章详细讲解了环境搭建(1分钟完成)、核心代码逻辑(3分钟掌握)以及性能调优技巧(3分钟进阶),提供可直接运行的代码示例。重点包括:模型选择(优先yolov8n.pt)、摄像头参数优化、置信度阈值调整、检测类别指定等实用技巧,帮助开发者快速实现10-15FPS的实时检测效果,并针对不同场景提供优化建议。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 371

Codeforces730J-Bottles(0-1背包)

题目链接http://codeforces.com/contest/730/problem/J思路0-1背包 状态表示: d[i][j][k]d[i][j][k]代表选到第i个瓶子时,已经选择了k个瓶子,选中瓶子的总体积为j时,选中的瓶子装水的最大总体积 状态转移: 选:d[i][j][k]=max(d[i][j][k],d[i−1]]j−b[i]][k−1]+a[i])d[i][j][k]

博客已迁移至:lzed.github.io 889

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

HDU3790-最短路径问题(最短路+dp)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3790思路裸的最短路+dp 先跑一遍Dijkstra获得d[]数组,然后dp:f[v]代表节点v的最小花费,转移方程:f[v]={min(f[v],f[u]+p(u,v))|d[v]=d[u]+w(u,v)}f[v] = \{min(f[v], f[u] + p(u, v)) | d[v] = d[u]

博客已迁移至:lzed.github.io 603

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HDU5900-QSC and Master(区间dp)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5900思路区间dp,这道题有个坑点就是比如3 4 8 9,比如4,8选掉了,3和9就变成了相邻的 状态表示:d[i][j] = 区间[i, j]能获得的最大值 转移: 1. d[i][j] = max(d[i][j], d[i][k] + d[k + 1][j]) 2. 若a[i]和a[j]不互质,

博客已迁移至:lzed.github.io 519

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Codeforces713C-Sonya and Problem Wihtout a Legend(dp + 离散化)

题目链接http://codeforces.com/problemset/problem/713/C思路a[i]非常大但是n很小,可以考虑离散化,将一维考虑成下标,那么可以先将数组排序成b[i] 有一个题目是求非严格的单调递增序列需要的代价: 状态表示:d[i][j], 第i个数为b[]中的第j个数需要的最小代价 转移方程:d[i][j] = min(d[i][j], d[i - 1][k]

博客已迁移至:lzed.github.io 517

Leetcode 472 - Concatenated Words(dp)

题意给定一个字符串的列表,列表中的一些字符串能够由列表中的另外一些字符串拼接而成(至少两个)。问能够被拼接的字符串有哪些。思路其实和wordBreak那道题一样,只不过我们需要遍历一下待拼接的那个字符串。然后剩下的就是wordBreak一样了。细节注意我们用unordered_set来判断字符串是否存在的时候要注意去掉自身。代码const int maxn = 10005; int d[maxn];

博客已迁移至:lzed.github.io 517

Codeforces #370(div2)题解

A. Memory and Crow列个公式推一下就可以了#include <iostream> #include <cstring> #include <stack> #include <vector> #include <set> #include <map> #include <cmath> #include <queue> #include <sstream> #include <ioman

博客已迁移至:lzed.github.io 511

Leetcode 410 - Split Array Largest Sum(dp or 二分答案)

题意给定一个数组,将数组划分m组,要求每组的和的最大值最小思路算法1:dp首先我们这样考虑:我们要将前n个元素划分成m段,即先找一个划分点k,在[k + 1, n]不再划分。然后将[1, k]划分成m - 1段。那么就可以得到我们的状态表示和转移方程。状态表示:d[i,j]d[i, j],前i个元素,划分成j段的最大和。 转移方程:d[i,j]=min{max0≤k<i{d[k,j−1]},∑p=

博客已迁移至:lzed.github.io 497

LA3983-Robotruck(dp + 单调队列)

题目链接https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1984思路如果选择机器人当前所在的点和当前的载重作为状态的话,其中n <= 100000, C<= 100,则状态数一共就有1e7,明显会T,于是只有减少状态数。 考虑仅将当前所在的点

博客已迁移至:lzed.github.io 475

HDU1024-Max Sum Plus Plus(dp)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1024题意:给定一个序列A,长度为n,从中找出m段,使其和最大,其中n <= 1000000,m > 0思路:d[i][j]表示在将第i个数选入第j段的最大和,则目标max(d[k][m]),其中k ∈ [m, n]; 对A[i],可以和A[i - 1]放入同一段,也可以开辟新的一段,于是转移方程为:d[

博客已迁移至:lzed.github.io 472

UVALive3181-Fixing the Great Wall(区间dp)

题目链接https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1182思路可以发现这样一个性质:假设A点离起点比B点更远,如果先访问A再访问B一定不会比先访问B再访问A更优,即区间dp。 因此将起点加入到点中,并且按照距离排序。每次做出的选择就是左

博客已迁移至:lzed.github.io 471

Leetcode 213 - House Robber II(dp)

题意和之前的House Robber差不多,但是多了一个条件就是:房子围成的是一个环,即最后一个房子和第一个房子是连在一起的。思路状态表示和转移方程和House Robber一样。状态表示:d[i,j]d[i, j],是否选择第i个房子能够获得的最大价值。d[i,0]d[i, 0]代表不选择,d[i,1]d[i, 1]代表选择。 转移方程: d[i,0]=max(d[i−1,0],d[i−1,1

博客已迁移至:lzed.github.io 450

Codeforces742D-Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+并查集)

题目链接http://codeforces.com/contest/742/problem/D思路首先,用并查集将有朋友关系的人分为一组,然后剩下的就是分组背包的问题了 分组背包 设有k个分组,每个分组内有一些物品(每个物品价值bib_i,重量wiw_i) 现在有一个背包,容量为v,要从这k组里面,每一组选一个或者一个都不选,求能选取的最大价值 状态表示d[k][j]d[k][j]:当前选

博客已迁移至:lzed.github.io 435

Codeforces 803E - Roma and Poker(dp)

题目链接http://codeforces.com/contest/803/problem/E思路dp状态表示d[i][j]d[i][j],第i局得分为j是否成立转移方程 这一局为?,即可能赢,输,平局:d[i][j]=d[i−1][j−1]|d[i−1][j+1]|d[i−1][j]d[i][j] = d[i - 1][j - 1] | d[i - 1][j + 1] | d[i - 1][j]

博客已迁移至:lzed.github.io 424
上一篇: Leetcode 115 - Distinct Subsequences(dp)
下一篇: Leetcode 221 - Maximal Square(dp)
Lzed
博客等级 码龄12年 5粉丝 256原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值