【动态规划】【字符串】C++算法:140单词拆分

作者推荐

【动态规划】【字符串】扰乱字符串

本文涉及的基础知识点

动态规划 字符串

LeetCode140:单词拆分 II

给定一个字符串 s 和一个字符串字典 wordDict ,在字符串 s 中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序 返回所有这些可能的句子。
注意:词典中的同一个单词可能在分段中被重复使用多次。
示例 1:
输入:s = “catsanddog”, wordDict = [“cat”,“cats”,“and”,“sand”,“dog”]
输出:[“cats and dog”,“cat sand dog”]
示例 2:
输入:s = “pineapplepenapple”, wordDict = [“apple”,“pen”,“applepen”,“pine”,“pineapple”]
输出:[“pine apple pen apple”,“pineapple pen apple”,“pine applepen apple”]
解释: 注意你可以重复使用字典中的单词。
示例 3:
输入:s = “catsandog”, wordDict = [“cats”,“dog”,“sand”,“and”,“cat”]
输出:[]
参数范围
1 <= s.length <= 20
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 10
s 和 wordDict[i] 仅有小写英文字母组成
wordDict 中所有字符串都 不同

动态规划

n = s.length
分两步:
一,计算所有子串是否存在相等的word,如果存在记录其下标,不存在-1。
二,通过动态规划计算所有所有前缀可以组成的字符串。

态规范分析

动态规划的状态表示dp[i]记录s[0,)所有可能组成的字符串
动态规划的转移方程vIndex[left][i - 1]不为-1,则dp[left]可以和[left,i)拼接
动态规划的初始状态dp[0]有一个空字符串
动态规划的填表顺序i从小到大。由短到长处理子字符串,确保动态规划的无后效性
动态规划的返回值dp.back()

代码

核心代码

class Solution {
public:vector<string> wordBreak(string s, vector<string>& wordDict) {m_c = s.length();unordered_map<string, int> mStrIndex;for (int i = 0; i < wordDict.size(); i++){mStrIndex[wordDict[i]] = i;}vector<vector<int>> vIndex(m_c, vector<int>(m_c, -1));for (int i = 0; i < m_c; i++){for (int j = i; j < m_c; j++){const auto tmp = s.substr(i, j - i + 1);if (mStrIndex.count(tmp)){vIndex[i][j] = mStrIndex[tmp];}}}vector<vector<string>> dp(m_c+1);dp[0].emplace_back("");for (int i = 1; i <= m_c; i++){for (int left = 0; left < i; left++){const int inx = vIndex[left][i - 1];if (-1 == inx){continue;}for (string s : dp[left]){dp[i].emplace_back(s + (s.empty() ? "" : " ") + wordDict[inx]);}}}return dp.back();}int m_c;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}
}int main()
{string s;	vector<string> wordDict;{Solution sln;s = "catsanddog", wordDict = { "cat", "cats", "and", "sand", "dog" };auto res = sln.wordBreak(s, wordDict);Assert(vector<string>{"cats and dog", "cat sand dog"}, res);}{Solution sln;s = "pineapplepenapple", wordDict = { "apple", "pen", "applepen", "pine", "pineapple" };auto res = sln.wordBreak(s, wordDict);Assert(vector<string>{"pine apple pen apple", "pineapple pen apple", "pine applepen apple"}, res);}{Solution sln;s = "catsandog", wordDict = { "cats", "dog", "sand", "and", "cat" };auto res = sln.wordBreak(s, wordDict);Assert(vector<string>{}, res);}
}

2023年1月

class Solution {
public:
vector wordBreak(string s, vector& wordDict) {
m_c = s.length();
m_vPosWord.resize(s.length());
for (int i = 0; i < wordDict.size();i++ )
{
const auto& f = wordDict[i];
int iPrePos = 0;
while (true)
{
int iPos = s.find(f, iPrePos);
if (-1 == iPos)
{
break;
}
m_vPosWord[iPos].push_back(i);
iPrePos = iPos + 1;
}
}
m_pWords = &wordDict;
dfs(0);
return m_vRet;
}
void dfs(int iPos)
{
if (iPos >= m_c)
{
string s = “”;
for (int i = 0; i < m_vIndexWord.size(); i++)
{
if (0 != i)
{
s += " ";
}
s += (*m_pWords)[m_vIndexWord[i]];
}
m_vRet.push_back(s);
return;
}
for (const auto& f : m_vPosWord[iPos])
{
m_vIndexWord.push_back(f);
dfs(iPos + (m_pWords)[f].length());
m_vIndexWord.pop_back();
}
}
vector m_vRet;
vector<vector> m_vPosWord;
vector m_vIndexWord;
vector
m_pWords;
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在电商狂欢中,什么平台更加对商家有利?

我是电商珠珠 近年来&#xff0c;不管是直播电商也好&#xff0c;电商平台也好&#xff0c;都一直朝着向上走的趋势。 我做电商也已经有5年时间了&#xff0c;期间做过天猫&#xff0c;快手、抖店&#xff0c;团队从原来的几个人&#xff0c;扩大到了70。 在22年10月&#x…

Python 面向对象之多态和鸭子类型

Python 面向对象之多态和鸭子类型 【一】多态 【1】概念 多态是面向对象的三大特征之一多态&#xff1a;允许不同的对象对同一操作做出不同的反应多态可以提高代码的灵活性&#xff0c;可扩展性&#xff0c;简化代码逻辑 【2】代码解释 在植物大战僵尸中&#xff0c;有寒冰…

UE4.27_PIE/SIE

UE4.27_PIE/SIE 1. 疑问&#xff1a; 不明白什么是PIE/SIE? 不知道快捷键&#xff1f; 2. PIE/SIE: play in editor/simulate in editor 3. 快捷键&#xff1a; F8: 运行时possess&eject切换 4. 运行操作效果&#xff1a; PIE&SIE

3d全景怎么拍摄?应用领域有哪些?

3d全景技术是综合了VR技术和全景拍摄的一种新型应用技术&#xff0c;通过3D全景技术可以为用户带来720度无死角的观看方式和真实的观看体验&#xff0c;那么3d全景是怎么拍摄制作的呢&#xff1f;应用领域又有哪些呢&#xff1f; 3d全景拍摄制作流程其实不难&#xff0c;常见的…

【Docker】配置阿里云镜像加速器

默认情况下&#xff0c;将来从docker hub &#xff08;https://hub.docker.com )上下载镜像太慢&#xff0c;所以一般配置镜像加速器。 没有账号的注册一个账号并登录 登录之后点击控制台 查看 cat /etc/docker/daemon.json

腾讯云2核2G3M服务器够用吗?腾讯云2核2G3M云服务器性能评测

阿里云轻量应用服务器2核2G3M带宽优惠价格62元一年&#xff0c;100%CPU性能&#xff0c;3M带宽下载速度384KB/秒&#xff0c;40GB SSD系统盘&#xff0c;月流量200GB&#xff0c;折合每天6.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的价格支付流量费&#xff0c;地域…

大数据StarRocks(五) :数据类型

StarRocks 支持数据类型&#xff1a;数值类型、字符串类型、日期类型、半结构化类型、其他类型。您在建表时可以指定以下类型的列&#xff0c;向表中导入该类型的数据并查询数据。 5.1 数值类型 SMALLINT2 字节有符号整数&#xff0c;范围 [-32768, 32767] INT4 字节有符号整…

2024最新Selenium面试题,建议收藏备用!

一.你在TestNG中使用了哪些注解&#xff1f; Test BeforeSuite AfterSuite BeforeTest AfterTest BeforeClass AfterClass BeforeMethod AfterMethod 二.如何从Excel中读取数据&#xff1f; FileInputStream fs new FileInputStream(“excel文件路径”); Workbook …

代码随想录day21 二叉搜索树进阶

530.二叉搜索树的最小绝对差 题目 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#xff1a; 思考 本题有一种笨办法&#xff0c;就是把二叉树的所有结点都存到一个vector里&#xff0c;因为二叉搜索树是左中右排序…

【致远FAQ】V8.0_甘特图能不能实现行表头一级一级显示(树形结构)

问题描述 甘特图能不能实现行表头一级一级显示&#xff08;树形结构&#xff09; 问题解决 设置统计时把合并同类型和显示行合计都勾选上就可以了 效果参考

AcWing 851. spfa求最短路AcWing 852. spfa判断负环—spfa算法

问题链接:AcWing 851. spfa求最短路 问题描述 spfa算法是对bellman-ford算法的改进&#xff0c;bellman-ford算法比较笨&#xff0c;要遍历所有边来更新&#xff0c;其实如果当前点没有被更新的话&#xff0c;就不用用当前点来更新他所连接的点了。我们只需要每次更新一个点后…

小游戏实战丨基于Tkinter的五子棋小游戏

文章目录 写在前面Tkinter五子棋系列文章写在后面 写在前面 本期内容&#xff1a;基于tkinter的五子棋小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700190 实验环境 python3.11及以上pycharmtkinter Tkinter Tkinter是Python的一个标准…

vue2 element 弹出框拖拽会出现一层阴影问题

问题如图所示&#xff1a; 因增加 draggable 属性导致我弹窗表单清空文本框时&#xff0c;从右向左选中字体会出现拖拽阴影效果 去掉 draggable 即可 <template><div class"sys-jobTrigger-container"><el-dialog:visible.sync"state.isShowD…

密码学:一文看懂初等数据加密一对称加密算法

文章目录 对称加密算法简述对称加密算法的由来对称加密算法的家谱数据加密标准-DES简述DES算法的消息传递模型DES算法的消息传递过程和Base64算法的消息传递模型的区别 算法的实现三重DES-DESede三重DES-DESede实现 高级数据加密标准一AES实现 国际数据加密标准-IDEA实现 基于口…

25计算机专业考研经验贴之准备篇

Hello各位小伙伴&#xff0c;大家新年好&#xff01; 马上就要进入寒假假期了&#xff0c;25考研也该提上日程了。今天先跟大家分享一下大家在假期可以先做起来的准备工作。 【选择学校】 择校是个非常重要的内容&#xff0c;因为不同学校的考试内容是不一样的&#xff0c;有些…

SpringBoot基于哨兵模式的Redis(7.2)集群实现读写分离

文章目录 一、前提条件二、SpringBoot访问Redis集群1. 引入依赖2. yaml配置3. 设置读写分离4. 简单的controller 三、运行四、测试1. 写2. 读3. 额外测试 环境 docker desktop for windows 4.23.0redis 7.2Idea 一、前提条件 先根据以下文章搭建一个Redis集群 Docker-Compo…

FreeRTOS 实时操作系统第九讲 - 链表 (数据结构)

一、链表简述 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点&#xff08;链表中每一个元素称为节点&#xff09;组成&#xff0c;节点可以在运行时动态生成。每个节点包括两个部分&…

Spring整合MyBatis框架!!!

搭建环境&#xff1a; pom.xml: <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></pro…

指定linux文件夹下所有文件赋权命令“chmod -R 755”

仓库&#xff1a;Ai-trainee/GPT-Prompts-Hub 下面我们假设要为&#xff1a;/opt/robot/lib/robot_control/下所有子文件赋权 如果要为 robot_control 目录中的所有文件分配权限&#xff08;在 Linux 术语中也称为“更改文件权限”或“chmod”&#xff09;&#xff0c;则可以…

残疾大学生找工作好难

有点肢体残疾且普通话不太标准的大学生好难找工作啊&#xff0c;怎么办&#xff1f;难道得去捡垃圾了&#xff1f;求学多年&#xff0c;好容易读了个大学(省内一本)&#xff0c;我咋这么命苦&#xff0c;找了800多家&#xff0c;面试好几家&#xff0c;都没一个要我的。