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

news/2025/3/25 13:48:03/

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) {// 用于存储每个字母最后出现的位置,初始化为-1vector<int> last_position(26, -1);  vector<int> ans;  // 存储结果,保存每个分割部分的长度// 记录每个字母最后出现的位置for (int i = 0; i < s.size(); i++) {// 'a' -> 0, 'b' -> 1, ..., 'z' -> 25last_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) {// 用于存储每个字母最后出现的位置,初始化为-1vector<int> last_position(26, -1);  vector<int> ans;  // 存储结果,保存每个分割部分的长度// 记录每个字母最后出现的位置for (int i = 0; i < s.size(); i++) {// 'a' -> 0, 'b' -> 1, ..., 'z' -> 25last_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.ppmy.cn/news/1582459.html

相关文章

论文阅读笔记——MAGICDRIVE: STREET VIEW GENERATION WITH DIVERSE 3D GEOMETRY CONTROL

MagicDrive 论文 MagicDrive 通过对 3D 数据和文本数据的多模态条件融合和隐式视角转换&#xff0c;实现了高质量、多视角一致的 3D 场景生成。 几何条件编码 Cross-attention&#xff1a;针对顺序数据&#xff0c;适合处理文本标记和边界框等可变长度输入。Additive encoder…

并查集——108. 冗余连接

108. 冗余连接 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图: 现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图: 先请你找出冗余边,删除后…

Java面试黄金宝典5

1. ConcurrentHashMap 和 HashTable 有哪些区别 原理 HashTable&#xff1a;它继承自 Dictionary 类&#xff0c;是 Java 早期提供的线程安全哈希表。其线程安全的实现方式是对每个方法都使用 synchronized 关键字进行同步。例如&#xff0c;在调用 put、get 等方法时&#xff…

Linux进程信号(下:补充)

Linux进程信号&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/146323008?fromshareblogdetail&sharetypeblogdetail&sharerId146323008&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link我们本篇来补充…

《概率论与数理统计》期末复习笔记_上

目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…

Spring Boot定时任务设置与实现

Spring Boot定时任务设置与实现 在Spring Boot中&#xff0c;可以使用Scheduled注解来创建定时任务。以下是一个简单的示例&#xff0c;展示了如何在项目启动后每5秒调用一次指定的方法。 1. 添加依赖 首先&#xff0c;确保你的pom.xml文件中包含Spring Boot的依赖&#xff…

HTML 图像与多媒体元素:拓展学习边界的进度记录(一)

开篇&#xff1a;学习启程 在前端开发的广袤领域中&#xff0c;HTML 作为构建网页的基石&#xff0c;其重要性不言而喻。而 HTML 图像与多媒体元素&#xff0c;就像是为这座基石添上了绚丽的色彩与灵动的音符&#xff0c;赋予网页更加丰富的表现力和交互性。作为一名热衷于探索…

《Next.js 14 App Router 实战:用「Server Actions」重构全栈表单的最佳实践》

文章目录 一、传统表单方案的七大痛点1.1 开发者调研数据&#xff08;N500&#xff09;1.2 Server Actions核心优势 二、十分钟搭建全栈表单系统2.1 启用实验性功能2.2 基础表单组件 三、六大企业级实战场景3.1 场景一&#xff1a;实时地址校验3.2 场景二&#xff1a;防刷验证集…