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

news2025/1/18 3:32:44

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.coloradmin.cn/o/1370626.html

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

相关文章

高通平台开发系列讲解(USB篇)Ubuntu 下如何使用模块

文章目录 一、查看VID、PID二、adb添加2.1、在udev下添加模块的VID2.2、重启adb服务三、虚拟串口添加(AT、Diag)沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要图解高通平台上位机使用方法 一、查看VID、PID 在ubuntu下使用模块进行AT指令发送,Diag等串…

【学术会议】第三届神经计算青年研讨会 学习笔记

第三届神经计算青年研讨会 学习笔记 会议时间&#xff1a;2024-1-6至2024-1-7 会议地点&#xff1a;电子科技大学 会议介绍&#xff1a; 为提升我国神经计算⻘年研究队伍的学术⽔平和国际影响⼒&#xff0c;研讨会主题涵盖&#xff1a;神经系统建模与模拟、脑机接⼝与类脑智能、…

面试宝典之spring框架常见面试题

F1、类的反射机制有啥用&#xff1f; &#xff08;1&#xff09;增加程序的灵活性&#xff0c;可扩展性&#xff0c;动态创建对象。 &#xff08;2&#xff09;框架必备&#xff0c;任何框架的封装都要用反射。&#xff08;框架的灵魂&#xff09; F2、获取Class对象的三种方…

继承和多态的详解

文章目录 1. 继承1.1 继承的概念1.3 继承的语法1.3 父类成员访问1.3.1 子类中访问父类的成员变量1.3.2 子类中访问父类的成员方法 1.4 子类构造方法 2.super关键字2.1 super关键字的概念2.2 super和this的区别 3. 在继承中访问限定符的可见性4. 继承方式的分类5. 多态5.1 多态的…

Maven 基础总结篇

Maven 基础总结篇 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构&#xff1a;用于解决不同IDE&#xff08;例如eclipse与IDEA&#xff09;不同的项目结构的问题 提供了一套标准化的构建流程&#xff08;编译&…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)二

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…

高效构建Java应用:Maven入门和进阶(三)

高效构建Java应用&#xff1a;Maven入门和进阶&#xff08;三&#xff09; 三. Maven的核心功能和构建管理3.1 依赖管理和配置3.2 依赖传递和冲突3.3 依赖导入失败场景和解决方案3.4 扩展构建管理和插件配置 三. Maven的核心功能和构建管理 3.1 依赖管理和配置 Maven 依赖管理…

Python基础知识:整理7 字典的定义及其相关操作

1 字典的定义 # 1. 字典的定义 # 定义字典的字面量 # {key: value, key: value, ......, key: value}# 定义字典变量 # my_dict {key: value, key: value, ......, key: value}# 定义空字典 # my_dict {} # my_dict dict()定义重复Key的字典 my_dict1 {"张三": …

随机输一次

大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个控制赢面的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方意识到你在控制结果&#xff0c;你需要隔 K …

电脑文件mfc100u.dll丢失的解决方法分析,怎么修复mfc100u.dll靠谱

mfc100u.dll丢失了要怎么办&#xff1f;其实很多人都遇到过这样的电脑故障吧&#xff0c;说这个mfc100u.dll文件已经不见了&#xff0c;然后一些程序打不开了&#xff0c;那么这种情况我们要怎么解决呢&#xff1f;今天我们就来给大家详细的说说mfc100u.dll丢失的解决方法。 一…

Redis入门-redis的五大数据类型+三种特殊的数据类型

前言&#xff1a;Redis有五大基本类型与三种特殊类型的介绍 Redis有五大基本类型&#xff1a;字符串&#xff08;string&#xff09;、哈希&#xff08;hash&#xff09;、列表&#xff08;list&#xff09;、集合&#xff08;set&#xff09;和有序集合&#xff08;sorted se…

ATTCK视角下的信息收集:Sysmon检测

目录 1、简介 2、使用Sysmon 3、检测Sysmon是否安装运行 4、检测Sysmon是否被卸载 5、使Sysmon在终端隐匿运行的技术 1、简介 Sysmon&#xff08;系统监视器&#xff09;是由windows sysinternals 出品的Sysinternals 系列工具中的一个 它是windows系统服务和设备驱动程…

VMware通过微PE安装window XP系统

软/硬件版本&#xff1a;微PE V1.3、VMware Workstation 12 Pro、windows xp professional sp3 目录&#xff1a;①不成功的3点原因&#xff1b;②安装教程 安装不成功的原因有3点&#xff1a; 1、VMware磁盘格式选择IDE&#xff0c;否则系统安装界面将出现0x0000007B错误代码。…

【机器学习】常见算法详解第2篇:K近邻算法各种距离度量(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…

k8s源码阅读环境配置

源码阅读环境配置 k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理&#xff0c;同时提升我们Go编程能力。 IDE使用Goland&#xff0c;代码阅读环境需要进行如下配置&#xff1a; 从github上下载代码&#xff1a;https://github.com/kubernetes/kubernetes在GOPATH目…

YOLOv3算法较YOLOv1及YOLOv2的区别

yoloV3以V1&#xff0c;V2为基础进行的改进&#xff0c;主要有&#xff1a;利用多尺度特征进行目标检测&#xff1b;先验框更丰富&#xff1b;调整了网络结构&#xff1b;对象分类使用logistic代替了softmax,更适用于多标签分类任务。 3.1算法简介 YOLOv3是YOLO (You Only Lo…

Python基础语法(上)——基本语法、顺序语句、判断语句、循环语句(有C++基础快速掌握Python语言)

文章目录 0.python小技巧与易错点1.python 与 c 语法有哪些区别2.Python基本语法2.1python的变量类型2.2python中的运算符2.3python中的表达式2.4python中的输入输出 3.python判断语句3.1基本用法&#xff1a;3.2关于else if 的用法3.3关于pass语句3.4python变量的作用域3.5pyt…

2024年1月9日

2024年1月9日09:26:57待在工作室玩千恋万花和登录PTA练习习题 2024年1月9日09:28:02判断素数肯定会成为考试的关键点之一 2024年1月9日15:13:49完成java的复习 2024年1月9日15:16:41判断反馈类型 2024年1月9日15:20:29行列式求系数通过沙路法展开得到 2024年1月9日15:21:1…

【leetcode】力扣算法之删除链表中倒数第n个节点【中等难度】

删除链表中倒数第n个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 用例 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 输入&#xff1a;head …

【OSG案例详细分析与讲解】之二:【着色文件转换为字符数组】

文章目录 一、【着色文件转换为字符数组】前言 二、【着色文件转换为字符数组】Shader转换 三、【着色文件转换为字符数组】转换函数 1.转换函数 2.字符替换函数 四、【着色文件转换为字符数组】示例 1.GLSL2Cpp.cpp文件&#xff1a; 2.Qt pro文件&#xff1a; 五、【着色文件转…