LeetCode 热题 100_划分字母区间(80_763_中等_C++)(贪心算法(求并集))

news2025/3/24 18:22:00

LeetCode 热题 100_划分字母区间(80_763)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(贪心算法(求交集)):
      • 代码实现
        • 代码实现(思路一(贪心算法(求并集)):
        • 以思路一为例进行调试

题目描述:

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 “ababcc” 能够被分为 [“abab”, “cc”],但类似 [“aba”, “bcc”] 或 [“ab”, “ab”, “cc”] 的划分是非法的。

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

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

输入输出样例:

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

示例 2:
输入:s = “eccbbbbdec”
输出:[10]

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

题解:

解题思路:

思路一(贪心算法(求交集)):

1、题目要求同一字母最多出现在一个片段中。所以需求求出相交字母区间的并集。可以先遍历一遍字符串记录每个字母最后出现的位置。再从左往右遍历一遍,则必定先访问每个字母第一次出现的位置。将相交的字母区间求并集。

2、具体思路如下:
① 遍历一遍字符串记录每个字母最后出现的位置。
② 再从左往右遍历一遍,当碰到一个字母时判断当前字母最后出现的位置是否比之前字母出现的最远位置远,更新最远位置。
③ 当遍历到遍历过字母的最远位置时,记录区间中元素的个数,并重复 ② 和 ③ 过程,直到遍历完整个数组。

例: s=“ababc”
记录字母出现的最远位置 last_position={a:2,b:3,c:4}
再从左往右遍历一遍:
① left=0,right=0。(left为当前区间的最左侧位置,right为当前区间的最远位置)
② i=0,字母a的最远位置为2,right=2
③ i=1,字母b的最远位置为3,right=3
④ i=2,字母a的最远位置为2,right=3
⑤ i=3,字母b的最远位置为3,right=3,i==right 记录区间元素个数 right-left+1=4。left=i+1=4
⑥ i=4,字母4的最远位置为4,right=4,i ==right记录区间元素个数 right-left+1=1。

3、复杂度分析:
① 时间复杂度:O(n),其中 n 是字符串的长度。需要遍历字符串两次。
② 空间复杂度:O(∣Σ∣),其中 Σ 是字符串中的字符集。这道题中,字符串只包含小写字母,因此 ∣Σ∣=26。

代码实现

代码实现(思路一(贪心算法(求并集)):
class Solution {
public:
    vector<int> partitionLabels(string s) {
        // 用于存储每个字母最后出现的位置,初始化为-1
        vector<int> last_position(26, -1);  
        vector<int> ans;  // 存储结果,保存每个分割部分的长度
        
        // 记录每个字母最后出现的位置
        for (int i = 0; i < s.size(); i++) {
            // 'a' -> 0, 'b' -> 1, ..., 'z' -> 25
            last_position[s[i] - 'a'] = i;  
        }

        int left = 0, right = 0;  // left指向当前分区的起始位置,right指向当前分区的结束位置
        for (int i = 0; i < s.size(); i++) {
            // 更新当前字母的最后出现位置,right表示当前分区的结束位置
            right = max(right, last_position[s[i] - 'a']);  

            // 如果当前索引i已经到达该分区的最后位置,说明当前分区结束
            if (i == right) {
                // 记录当前分区的长度
                ans.push_back(right - left + 1);  
                left = i + 1;  // 更新下一个分区的起始位置
            }
        }

        // 返回所有分区的长度
        return ans;  
    }
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    vector<int> partitionLabels(string s) {
        // 用于存储每个字母最后出现的位置,初始化为-1
        vector<int> last_position(26, -1);  
        vector<int> ans;  // 存储结果,保存每个分割部分的长度
        
        // 记录每个字母最后出现的位置
        for (int i = 0; i < s.size(); i++) {
            // 'a' -> 0, 'b' -> 1, ..., 'z' -> 25
            last_position[s[i] - 'a'] = i;  
        }

        int left = 0, right = 0;  // left指向当前分区的起始位置,right指向当前分区的结束位置
        for (int i = 0; i < s.size(); i++) {
            // 更新当前字母的最后出现位置,right表示当前分区的结束位置
            right = max(right, last_position[s[i] - 'a']);  

            // 如果当前索引i已经到达该分区的最后位置,说明当前分区结束
            if (i == right) {
                // 记录当前分区的长度
                ans.push_back(right - left + 1);  
                left = i + 1;  // 更新下一个分区的起始位置
            }
        }

        // 返回所有分区的长度
        return ans;  
    }
};

int main(int argc, char const *argv[])
{
    
    string str="ababcbacadefegdehijhklij";
    Solution s;
    vector<int> ans= s.partitionLabels(str);
    for (auto &i : ans){
        cout<<i<<" ";
    }
    return 0;
}

LeetCode 热题 100_划分字母区间(80_763)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

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

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

相关文章

C++ --- 多态

1 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…

HAL库中使用空闲中断+DMA接收数据,接收失败的问题

问题&#xff1a; 串口屏与单片机通过串口&#xff08;USART1&#xff09;进行通信&#xff0c;调试时发现问题&#xff0c;现象如下&#xff1a; 手动页面的几个文本&#xff0c;输入的数字不会显示出来&#xff0c;比如初始值为0&#xff0c;输入200&#xff0c;200会一闪而…

使用pycel将Excel移植到Python

1.适用需求 有些工作可能长期适用excel来进行公式计算&#xff0c;当需要把工作流程转换为可视化界面时&#xff0c;开发人员不懂专业逻辑&#xff0c;手动摸索公式很大可能出错&#xff0c;而且费时费力 2.可用工具及缺点 pandas 方便进行数据处理&#xff0c;支持各种格…

学习应用层

应用层概述 客户/服务器方式&#xff08;C/S&#xff09;和对等方式&#xff08;P2P&#xff09; 动态主机配置协议DHCP 客户/服务器方式 DHCP报文会被封装成为UDP用户数据报&#xff0c;DHCP服务器端口号是UDP67&#xff0c;用户是UDP68。 广播发送&#xff0c;是因为并不知道…

C/C++转换为字符串宏和字符串拼接宏的综合使用

本文内容参考: C/C++ 宏拼接和宏展开为字符串 - DoubleLi - 博客园 特此致谢! 1. 转换为字符串宏与字符串拼接宏 (1)转换为字符串宏 转换为字符串的宏为: #define STR(x) #x //转字符串 (2)字符串拼接宏 字符串拼接的宏为: #define CONCAT(x,y) x##y //拼接 2…

掌握新编程语言的秘诀:利用 AI 快速上手 Python、Go、Java 和 Rust

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

个人常用的chrome好用插件

chrome可以说是兼容性和实用性较高的浏览器 没有复杂的ui 沉重的广告 加上各种各样的浏览器插件 现在罗列一下个人常用的几款好用的插件 1. Adblock Plus 一款免费的广告拦截器&#xff0c;可以拦截大部分网站上的广告推荐&#xff0c;还你一个干净舒服的页面 以下为b站演示…

数据库设计-笔记2

1.介绍一下MySQL 历史与发展 MySQL 最初由瑞典的 MySQL AB 公司开发&#xff0c;于 1995 年正式发布。2008 年&#xff0c;MySQL AB 公司被 Sun Microsystems 收购&#xff0c;之后 Sun 又被甲骨文&#xff08;Oracle&#xff09;公司收购&#xff0c;MySQL 成为 Oracle 旗下…

损失函数理解(二)——交叉熵损失

损失函数的目的是为了定量描述不同模型&#xff08;例如神经网络模型和人脑模型&#xff09;的差异。 交叉熵&#xff0c;顾名思义&#xff0c;与熵有关&#xff0c;先把模型换成熵这么一个数值&#xff0c;然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…

基于随机森林回归预测葡萄酒质量

基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理&#xff08;标准化、划分训练/测试集&#xff09;3.4模型训练与优化&#xff08;随机森林回归 超参…

【Qt】QWidget属性2

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 1. windowOpacity属性2. cursor属性2.1 自定义光标 3. font属性4.tooltip属性5. focusPolicy属性6. 总结 由于QWidget的常见属性实在太多&a…

OpenGL ES ->乒乓缓冲,计算只用两个帧缓冲对象(Frame Buffer Object)+叠加多个滤镜作用后的Bitmap

乒乓缓冲核心思想 不使用乒乓缓冲&#xff0c;如果要每个滤镜作用下的绘制内容&#xff0c;也就是这个滤镜作用下的帧缓冲&#xff0c;需要创建一个Frame Buffer Object加上对应的Frame Buffer Object Texture使用乒乓缓冲&#xff0c;只用两个Frame Buffer Object加上对应的F…

数据库练习2

目录 1.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 2.课堂代码练习 3.题目如下 一、单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4…

macOS Sequoia 15.3 一直弹出“xx正在访问你的屏幕”

&#x1f645; 问题描述 macOS 系统升级后&#xff08;15.2或者15.3均出现过此问题&#xff09;&#xff0c;不管是截图还是开腾讯会议&#xff0c;只要跟捕捉屏幕有关&#xff0c;都一直弹出这个选项&#xff0c;而且所有软件我都允许访问屏幕了&#xff0c;这个不是询问是否…

C# 调用 VITS,推理模型 将文字转wav音频调试 -数字人分支

Microsoft.ML.OnnxRuntime.OnnxRuntimeException: [ErrorCode:InvalidArgument] Input name: input_name is not in the metadata在 Microsoft.ML.OnnxRuntime.InferenceSession.LookupInputMetadata(String nodeName) 位置 D:\a\_work\1\s\csharp\src\Microsoft.ML.OnnxRuntim…

【Docker系列一】Docker 简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C++进阶——封装红黑树实现map和set

目录 1、源码及框架分析 2、模拟实现map和set 2.1 复用的红黑树框架及Insert 2.2 iterator的实现 2.2.1 iterator的核心源码 2.2.2 iterator的实现思路 2.3 map支持[ ] 2.4 map和set的代码实现 2.4.1 MyMap.h 2.4.2 MySet.h 2.4.3 RBTree.h 2.4.4 Test.cpp 1、源码及…

‘闭包‘, ‘装饰器‘及其应用场景

‘闭包’, 装饰器’及其应用场景 一, 闭包及其应用场景 图解 闭包的定义 概述: 内部函数 使用了 外部函数 的变量, 这种写法就称之为闭包. 格式: def 外部函数名(形参列表):外部函数的(局部)变量def 内部函数名(形参列表):内部函数的(局部)变量return 内部函数名前提条件: …

IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法

本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期&#xff1a;2025年3月22日 作者&#xff1a;任聪聪 现象描述&#xff1a; 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…

Powershell WSL导出导入ubuntu22.04.5子系统

导出Linux子系统 导出位置在C盘下,根据自己的实际情况更改即可Write-Host "export ubuntu22.04.5" -ForegroundColor Green wsl --export Ubuntu-22.04 c:\Ubuntu-22.04.tar 导入Linux子系统 好处是目录可用在任意磁盘路径,便于迁移不同的设备之间Write-Host &quo…