【leetcode 2707. 字符串中的额外字符】动态规划 字典树

2707. 字符串中的额外字符

题目描述

给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串,每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。

请你采取最优策略分割 s ,使剩下的字符 最少

动态规划

这是一个比较典型的动态规划问题,只要能够想到利用dp[i]表示s.substr(0,i)(也就时s从0开始,长度为i的子字符串)剩下的字符的最少数量,比较容易就能找到如下规律:

  • s.substr(0,i)的后缀与dictionary中一个长度为l的单词匹配,那么dp[i] = dp[i - l]
  • 如果s.substr(0,i)dictionary中所有单词都不匹配,那么个dp[i] = dp[i - 1] + 1

据此容易写出如下代码:

class Solution {
public:int minExtraChar(string s, vector<string>& dictionary) {int s_len = s.size();vector<int> dp(s_len + 1, 0);for(int i = 1;i <= s_len;++i) {dp[i] = dp[i - 1] + 1;for(auto it = dictionary.begin();it != dictionary.end();++it) {int w_len = (*it).size();if(w_len <= i && s.substr(i - w_len, w_len) == *it) {dp[i] = min(dp[i], dp[i - w_len]);}}}return dp[s_len];}
};

在这里插入图片描述

结果还算不错

利用字典树优化

上面思路中提到,要通过字符串的后缀与字典中单词是否匹配来判断动态规划的路径。

这容易让人想到字典树,也就是前缀树。关于字典树,我写过一篇字典树分析及实现。

虽然称为前缀树,经过一些变形也可以用来快速判断后缀是否匹配。

进而优化上面的实现,算是用空间换时间。

代码的改变还是比较大的,具体实现如下

struct Trie {struct Trie* children[26];bool isEnd;Trie() {isEnd = false;memset(children, 0, 26 * sizeof(struct Trie*));}
};
class Solution {
public:int minExtraChar(string s, vector<string>& dictionary) {struct Trie *root = new struct Trie();int s_len = s.size();vector<int> dp(s_len + 1, 0);// 插入字典中的单词 for(auto it = dictionary.begin();it != dictionary.end();++it) {int d_len = it->size();struct Trie *p = root;// 倒序插入单词,方便匹配后缀for(int i = d_len - 1;i >= 0;--i) {int idx = (*it)[i] - 'a';if(p->children[idx] == nullptr) {p->children[idx] = new struct Trie();}p = p->children[idx];}p->isEnd = true;}for(int i = 1;i <= s_len;++i) {dp[i] = dp[i - 1] + 1;struct Trie *p = root;for(int j = i - 1;j >= 0;--j) {int idx = s[j] - 'a';if(p == nullptr || p->children[idx] == nullptr) {// 如果中间有字符不匹配,后续就不可能有更长单词能匹配后缀了break;}p = p->children[idx];if(p->isEnd) {dp[i] = min(dp[i], dp[j]);}}}return dp[s_len];}
};

结果如下图,虽然时间上有一定提升,但空间占用却增加了一倍

在这里插入图片描述

ps:需要注意的是,这里用到了new去动态分配内存,理论上是要利用delete手动释放内存,防止内存泄露的。

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

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

相关文章

Go 如何处理死锁以提供哪些工具来检测或防死锁?

并发是 Go 的核心特性&#xff0c;它使程序能够同时处理多个任务。它是现代编程的一个强大组件&#xff0c;如果使用正确&#xff0c;可以产生高效、高性能的应用程序。然而&#xff0c;并发性也带来了顺序编程中不存在的某些类型错误的可能性&#xff0c;其中最臭名昭著的是死…

拼多多API的未来:无限可能性和创新空间

拼多多&#xff0c;作为中国电商市场的巨头之一&#xff0c;自成立以来一直保持着高速的发展态势。其API的开放为开发者提供了无限的可能性和创新空间&#xff0c;使得更多的商业逻辑和功能得以实现。本文将深入探讨拼多多API的未来发展&#xff0c;以及它所具备的无限可能性和…

面相圆润是有福气的象征

在中国传统文化中&#xff0c;面相是一个非常重要的概念。相信大家肯定听说过“相由心生”这个成语吧&#xff0c;这就是告诉我们&#xff0c;一个人的面貌其实是可以反映出他内心的状态和气质&#xff0c;也可以反映其性格、健康状况和运势等。而一个圆润的面相&#xff0c;则…

游泳耳机排行榜前四名,分享几款值得推荐的游泳耳机

游泳是一项全面锻炼身体的运动&#xff0c;然而&#xff0c;水的阻力有时让人感到运动的笨拙和单调。为了让游泳更具趣味性和挑战性&#xff0c;选择一款高品质的游泳耳机至关重要。以下是游泳耳机排行榜前四名&#xff0c;以及几款强烈推荐的游泳耳机&#xff0c;它们结合防水…

火狐谷歌兼容性问题整理

火狐谷歌兼容性问题整理 整理近期项目中遇到的火狐浏览器和谷歌浏览器兼容性问题。 数字输入框实现功能&#xff1a;限制输入框可输入内容类型为Number类型&#xff0c;其他类型不可输入。 &#xff08;1&#xff09;错误实现方法&#xff1a; 此方式在谷歌浏览器中可以实现&…

【QT-UI】

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), …

Python中级知识梳理

1. 文件操作 Python中的文件操作通常使用内置的open()函数来打开文件。以下是一个简单的示例&#xff1a; with open("file.txt", "r") as f:content f.read()print(content)在这个示例中&#xff0c;我们打开了名为"file.txt"的文件&#xf…

mac 快捷键

mac 程序坞 ctrlaltD:打开程序坞 调度中心 Ctrl键↑: 调度中心 Ctrl键↓:应用程序窗口 F11 : 显示桌面 输入法 Ctrl键空格: 切换输入法 Ctrl键Alt(Option)空格: 切换输入法 截屏 帮助 Ctrl键shift键/: 显示帮助

使用 CSS : 伪元素:after、过渡动画transition实现过渡效果(鼠标悬浮或点击 标签时,底部边框从左到右过渡)

首先&#xff0c;给 <span> 标签添加一个父元素&#xff0c;定义属性类名&#xff1a;nav-wrapper &#xff0c;父级设置相对定位。然后&#xff0c;使用 ::after 伪元素来创建一个与底部边框相同宽度的元素&#xff0c;初始时宽度为 0&#xff0c;通过过渡动画transitio…

「服务器」4.新手小白如何安装服务器环境-宝塔

刚开始初始化好的服务器&#xff0c;使用了阿里云客户端&#xff0c;看着网络脚本乱装&#xff0c;后来决定宝塔环境发现有重复的环境&#xff0c;遂决定重新初始化一下&#xff0c;然后重头干起。 重置服务器 将服务器关闭运行状态后&#xff0c;点击重新初始化云盘即可重新初…

GCF:在线市场异质治疗效果估计的广义因果森林

英文题目&#xff1a;GCF: Generalized Causal Forest for Heterogeneous Treatment Effects Estimation in Online Marketplace 中文题目&#xff1a;GCF&#xff1a;在线市场异质治疗效果估计的广义因果森林 单位&#xff1a;滴滴&美团 时间&#xff1a;2022 论文链接…

【数据库原理】期末突击(2)

有不会的题可以后台问我的哦&#xff0c;看见了就会回。祝大家期末心想事成。 数据库大题显而易见就只有几类&#xff0c;大家可以根据老师平时讲解的例题对应去解决一类型的题目。 前提知识; 候选码候选键关键字键码 关系代数&#xff1a;&#xff08;1&#xff09;传统&…

CST2024的License服务成功启动,仍报错——“The desired daemon is down...”,适用于任何版本!基础设置遗漏!

CST2024的License服务成功启动&#xff0c;仍报错——“The desired daemon is down…”&#xff0c;适用于任何版本&#xff01;基础设置遗漏&#xff01; CST2024的License服务成功启动后报错 若不能成功启动License服务&#xff0c;有可能是你的计算机名称带中文&#xff…

融云 CEO 董晗荣获 51CTO 「2023 年度科技影响力人物奖」

&#xff08;&#x1f446;点击获取《社交泛娱乐出海作战地图》&#xff09; 1 月 5 日&#xff0c;由知名 IT 技术媒体 51CTO 主办的第十八届“中国企业年终评选”正式揭晓榜单&#xff0c;融云 CEO 董晗荣获“2023 年度科技影响力人物奖”。关注【融云全球互联网通信云】了解…

【Android Studio】APP练手小项目——切换图片APP

本项目效果&#xff1a; 前言&#xff1a;本项目最终实现生成一个安卓APP软件&#xff0c;点击按钮可实现按钮切换图片。项目包含页面布局、功能实现的逻辑代码以及设置APP图标LOGO和自定义APP名称。 关于Android Studio的下载与安装见我的博文&#xff1a;Android Studio 最新…

蓝牙信标定位原理

定位原理&#xff1a;蓝牙信标的定位原理是基于RSSI蓝牙信号强度来做定位的。 根据应用场景不同&#xff0c;通过RSSI定位原理可分为两种定位方式 一、存在性定位 这种方式通常要求所需定位的区域安装一个蓝牙信标即可&#xff0c;手持终端扫描蓝牙信标信号&#xff0c;扫描…

huggingface下载太慢的问题

解决问题&#xff1a;huggingface网站模型文件太大&#xff0c;下载太慢 方式&#xff1a; huggingface镜像站网址 使用方法3的python脚本文件内容 import os# 下载模型 os.system(huggingface-cli download --resume-download THUDM/chatglm2-6b --local-dir /home/bennie…

Linux【C编程】 信号以及信号的处理方式

文章目录 1.什么是信号&#xff1f;1.1信号是内容受限的一种异步通信机制1.2信号由谁发出的&#xff1f;1.3信号由谁处理&#xff0c;如何处理 2.常见的信号3.进程对信号的处理3.1用signal函数处理SIGINT信号3.2使用sigaction 函数 4.alarm 和pause函数4.1 alarm函数详解4.2 pa…

vue element plus 安装

环境支持# Element Plus 可以在支持 ES2018 和 ResizeObserver 的浏览器上运行。 如果您确实需要支持旧版本的浏览器&#xff0c;请自行添加 Babel 和相应的 Polyfill 。 由于 Vue 3 不再支持 IE11&#xff0c;Element Plus 也不再支持 IE 浏览器。 Edge ≥ 79Firefox ≥ 78C…

用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

Retrieval-Augmented Generation&#xff08;RAG&#xff09;是一种强大的技术&#xff0c;能够提高大型语言模型&#xff08;LLM&#xff09;的性能&#xff0c;使其能够从外部知识源中检索信息以生成更准确、具有上下文的回答。 本文将详细介绍 RAG 在 LangChain 中的应用&a…