2024.1.9力扣每日一题——字符串中的额外

2024.1.9

      • 题目来源
      • 我的题解
        • 方法一 集合+动态规划
        • 方法二 字典树+动态规划

题目来源

力扣每日一题;题序:2707

我的题解

方法一 集合+动态规划

题目的要求是讲字符串s划分为多个不重叠的子串,然后尽可能使得更多的子串匹配到dictionary中的字符串,然后将这些匹配的子串删除之后,使得剩下的额外字符最小。
可以假设s的长度为n,分割的方式:

  • 把s的最后一个字符s[n-1]当做是额外字符,这问题转化为求长度为n-1的子问题;
  • 找到一个s的后缀s[j…n-1]构成的子串在dictionary中,这问题转换为j-1的子问题。

因此,可以将得出动态规划的转移方程:
          d p [ i ] = d p [ i − 1 ] + 1 , s [ i − 1 ] 当做额外字符 dp[i]=dp[i-1]+1,s[i-1]当做额外字符 dp[i]=dp[i1]+1s[i1]当做额外字符
          d p [ i ] = m i n ( d p [ i ] , d p [ j ] ) , s 的后缀 s [ j . . . n − 1 ] 构成的子串在 d i c t i o n a r y 中 dp[i]=min(dp[i],dp[j]),s的后缀s[j...n-1]构成的子串在dictionary中 dp[i]=min(dp[i],dp[j])s的后缀s[j...n1]构成的子串在dictionary
为了判断子串是不是在dictionary中,将dictionary中的字符串使用HashSet集合存储。

时间复杂度:O( n 3 + m n^3+m n3+m)。n为s的长度,m为dictionary的长度。m是初始化HashSet的时间; n 3 n^3 n3分别是递推需要O(n),每次子问题需要O(n),并且求子串需要O(n)。
空间复杂度:O(n+m)。dp数组的空间和HashSet的空间。

public int minExtraChar(String s, String[] dictionary) {int n=s.length();int m=dictionary.length;int[] dp=new int[n+1];Arrays.fill(dp,Integer.MAX_VALUE);Set<String> set=new HashSet<>();for(int i=0;i<m;i++){set.add(dictionary[i]);}dp[0]=0;for(int i=1;i<=n;i++){// s[i-1]当做额外字符dp[i]=dp[i-1]+1;for(int j=i-1;j>=0;j--){//s的后缀s[j...n-1]构成的子串在dictionary中if(set.contains(s.substring(j,i))){dp[i]=Math.min(dp[i],dp[j]);}}}return dp[n];
}
方法二 字典树+动态规划

在方法一中查找某个子串是否在dictionary中效率较低,因为查找了s[i+1,j],再次查找s[i,j],这时后者仅仅第一个字符不同,但是仍需要从开始开始对比,要花费O(n)的时间重复查找。
可以使用字典树存储dictionary中字符串的逆序,这样在字典树上找到表示后缀s[i+1,j]的节点后,只需要再花O(1)的时间来判断表示后缀s[i,j]的节点是否存在。

时间复杂度:O( n 2 + ∣ S ∣ n^2+|S| n2+S)。|S|表示dictionary中最长字符串的长度
空间复杂度:O(n+∣T∣⋅Σ)。|T|表示dictionary中所有字符串的长度之和,Σ为字符集的大小,这里是26。

 public int minExtraChar(String s, String[] dictionary) {
int n=s.length();int m=dictionary.length;int[] dp=new int[n+1];Arrays.fill(dp,Integer.MAX_VALUE);Trie t=new Trie();// 将dictionary中的字符串逆序插入字典树for(int i=0;i<m;i++){StringBuilder sb=new StringBuilder(dictionary[i]);t.insert(sb.reverse().toString());}dp[0]=0;for(int i=1;i<=n;i++){dp[i]=dp[i-1]+1;Trie node=t;for(int j=i-1;j>=0;j--){// 若当前节点为空表示在dictionary中找不到s[j,i]的字符串if(node!=null){// 看下一个字典树节点是不是存在node=node.searchSuffix(s.charAt(j));if(node!=null&&node.isEnd()){dp[i]=Math.min(dp[i],dp[j]);}}}}return dp[n];
}
class Trie {Trie children[];//子节点boolean isEndOf;//是否是结尾public Trie() {children=new Trie[26];isEndOf=false;}//插入新的字符串public void insert(String word) {Trie cur=this;for(int i=0;i<word.length();i++){int ch=word.charAt(i)-'a';if(cur.children[ch]==null){//若没有该分支,则新建分支cur.children[ch]=new Trie();}cur=cur.children[ch];}cur.isEndOf=true;//记录结尾}//判断当前字典树节点是不是一个结尾public boolean isEnd(){return isEndOf;}private Trie searchSuffix(char ch){//查找ch为结尾的字典树节点Trie cur=this;if(cur==null||cur.children[ch-'a']==null){return null;}cur=cur.children[ch-'a'];return cur;}
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

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

相关文章

【笔记】Helm-3 主题-2 Chart Hook

Chart Hook Helm提供了一个hook机制允许开发者在发布声明周期的某些点进行干预。比如您可以使用hook用于&#xff1a; 1、安装时在加载其他chart之前加载配置映射或密钥 2、安装新chart之前执行备份数据库的任务&#xff0c;然后在升级之后执行第二个任务用于存储数据。 3、…

mysql的gtid主从复制,从库误操作更新操作,

一&#xff1a;查看mysql的从库&#xff0c;发现sql进程状态 “no”.提示执行传输过来的binlog日志&#xff0c;执行失败&#xff0c; 二&#xff1a;查看主库对应的二进制日志的gtid地方。插入一些数据。 # mysqlbinlog --base64-outputdecode-rows -v mysql-bin.000001 |gre…

2019年认证杯SPSSPRO杯数学建模C题(第一阶段)保险业的数字化变革全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于 CART 决策树和 SVR 的客户续保概率预测 C题 保险业的数字化变革 原题再现&#xff1a; 车险&#xff0c;即机动车辆保险。保险自身是一种分散风险、消化损失的经济补偿制度&#xff0c;车险即为分散机动车辆在行驶过程中可能发作的未知风…

21道Java Spring MVC综合面试题详解含答案(值得珍藏)

1.概述 1.1 什么是Spring MVC&#xff1f;简单介绍下你对Spring MVC的理解&#xff1f; Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把模型-视图-控制器分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成…

CMake入门教程【高级篇】文件操作(file)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.概述2.使用说明3.完整代码示例4.实际使用中的技巧1.概述 在 CMake 项目中,file 命令是一个多功能工具,用于执行各种文件操作,如读写文件、复制和重命名文…

Docker介绍安装及使用

目录 引言一、什么是Docker?二、Docker的优势三、Docker的架构四、Docker的安装五、Docker的基本使用六、Docker与传统虚拟化的比较七、Docker的应用场景八、总结 引言 在现代的软件开发和部署中&#xff0c;容器化技术已经成为了一种趋势。Docker作为容器化技术的领先者&…

N-137基于springboot,vue运动会报名管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueAvueElementUI 服务端技术&#xff1a;springbootmybatis 本项…

Elasticsearch聚合优化 | 聚合速度提升5倍!

1、聚合为什么慢&#xff1f; 大多数时候对单个字段的聚合查询还是非常快的&#xff0c; 但是当需要同时聚合多个字段时&#xff0c;就可能会产生大量的分组&#xff0c;最终结果就是占用 Elasticsearch大量内存&#xff0c;从而导致 OOM 的情况发生。 实践应用发现&#xff0…

Java电影购票小程序在线选座订票电影

Java电影购票小程序 功能&#xff1a;注册用户可已查看电影场次评价选座订票退票&#xff0c;影院管理员可以排片退款在线卖票和管理演播室等。超级管理员可管理电影排片电影院用户管理等。 演示视频 小程序&#xff1a; https://www.bilibili.com/video/BV11W4y1A7mK/?shar…

深度剖析缓存相关问题:雪崩、穿透、预热、更新、降级

目录 引言 1. 缓存雪崩 1.1 问题描述 1.2 解决方案 1.2.1 加锁防止并发重建缓存 2. 缓存穿透 2.1 问题描述 2.2 解决方案 2.2.1 布隆过滤器防止无效请求 3. 缓存预热 3.1 问题描述 3.2 分析与解决方案 3.2.1 定时任务预热缓存 4. 缓存更新 4.1 问题描述 4.2 分析…

华为端口安全常用3种方法配置案例

安全动态mac地址学习功能 [Huawei]int g0/0/01 interface GigabitEthernet0/0/1 port-security enable //开启安全 port-security max-mac-num 2 //最多为2个mac地址学习 port-security protect-action restrict //丢包带警告 port-security aging-time 1 //mac地址的老化时间…

C/C++ 堆排序

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;数据结构_仍有未知等待探索的博客-CSDN博客 欢迎大家来指教&#xff01; 一、前言 今天要介绍的是堆排序。 首先什么是堆&#xff1f;简而言之&#xff0c;堆就是二叉树的数组形式&#xff0c;用数组来存…

css3边框与圆角

css3边框与圆角 前言边框的三要素边框的三要素小属性 四个方向的边框四个方向边框的三要素小属性 去掉边框利用边框制作三角形圆角 border-radius单独设置四个圆角小属性百分比为单位 盒子阴影阴影延展内阴影多阴影 结语 前言 在网页设计中&#xff0c;边框与圆角不仅仅是简单…

邂逅Node.JS的那一夜

邂逅Node.JS的那一夜&#x1f303; 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2; 本篇文章&#xff0c;并不完全适合小白&#xff0c;需要有一定的HTML、CSS、JS、HTTP、Web等知识及基础学习&#xff1a; &#x1f197;&#xff0c;紧接上文&#xff0c;…

uⅤ打印-小理光上海RYPC后台运动系统

uⅤ打印-小理光上海RYPC后台运动系统

ISO 11519-2 开环低速 CAN 网络(10K~125Kbps)

ISO 11519-2 标准的物理框图如下图 可理解为一个低速开环 CAN 总线网络&#xff1b;CAN 开环总线网络允许总线最大长度为 1km;最高速度为 125Kbps;这里的两根线是独立的&#xff0c;每根线上串联一个 2.2kΩ 的电阻&#xff1b;节点就是不同的设备&#xff0c;连接到一个开环总…

【微服务】日志搜集es+kibana+filebeat+redis+logstash(单机)

日志搜集系统搭建 基于7.17.16版本 ps: 项目是toB的&#xff0c;日志量不大 前置准备 软件下载 7.17.16版本。8.x版本需要JDK11 elastic.co/downloads/past-releasesJDK java8 Linux elastic 软件不能以root用户启动&#xff0c;需要创建用户 sudo useradd elastic #给此…

解决:ModuleNotFoundError: No module named ‘pymysql’

解决&#xff1a;ModuleNotFoundError: No module named ‘pymysql’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named pymysql背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff0c;直接安装方法二&#xff0c;手动下载安装方法三&#xff0c;…

云贝教育 |【技术文章】存储对象的LIBRARY CACHE LOCK/PIN实验(一)

注: 本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 实验环境 操作系统&#xff1a;Red Hat Enterprise Linux release 8.8 (Ootpa) 数据库&#xff1a;oracle Version 19.3.0.0.0 …

UE 引擎工具笔记

2023虚幻技术分享会视频 1.2023年虚幻引擎最新功能和技巧 [UFSH2023]2023年虚幻引擎最新功能和技巧 | Chris Murphy Epic Games_哔哩哔哩_bilibili 推荐细看下.总结了UE5的功能大概 2.调试技巧 [UFSH2023]总有一个你不知道的虚幻引擎调试技巧 | 陈拓 Epic Games_哔哩哔哩_…