LeetCode 763. 划分字母区间(贪心算法)

简介: LeetCode 763. 划分字母区间(贪心算法)

763. 划分字母区间


贪心算法

思路

一个字母要在同一个片段里,所以同一个字母第一次出现的位置和最后一次出现的位置在同一个片段中。所以先遍历一遍,获得每个字母最后一次出现的位置。


接下来,将字符串划分成尽可能多的片段:


对于每个被访问的字母 a ,取得当前字母 a 最后一次出现的位置 e n d c e ,那么当前片段结束下标一定不小于 e n d c ,因此 e n d = m a x ( e n d , e n d c )

当访问到下标 e n d endend 时,当前片段访问结束,长度为 e n d − s t a r t + 1 ,将长度添加到返回数组,然后令 s t a r t = e n d + 1 ,继续寻找下一个片段

重复上述过程,直到遍历完字符串。


代码实现

class Solution
{
public:
    vector<int> partitionLabels(string s)
    {
        int start = 0, end = 0;
        int last[26];
        vector<int> res;
        // 寻找每个字母最后出现的位置
        for (int i = 0; i < s.size(); i++)
        {
            last[s[i] - 'a'] = i;
        }
        // 使用贪心的方法将字符串划分为尽可能多的片段
        for (int i = 0; i < s.size(); i++)
        {
            end = max(end, last[s[i] - 'a']);
            if (end == i)
            {
                res.push_back(end - start + 1);
                start = end + 1;
            }
        }
        return res;
    }
};


复杂度分析

时间复杂度:O ( n ) ,其中 n 是字符串的长度。需要遍历字符串两次,第一次遍历时记录每个字母最后一次出现的下标位置,第二次遍历时进行字符串的划分。

空间复杂度:O ( ∣ Σ ∣ ),其中 Σ 是字符串中的字符集。这道题中,字符串只包含小写字母,因此 ∣ Σ ∣ = 26 。

目录
相关文章
|
1月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
144 4
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
6月前
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
242 11
|
9月前
|
存储 算法 索引
【狂热算法篇】探秘差分数组:算法星河中闪耀的区间掌控之星
【狂热算法篇】探秘差分数组:算法星河中闪耀的区间掌控之星
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
278 4
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
160 2
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
93 1
|
算法
Leetcode第57题(插入区间)
LeetCode第57题“插入区间”的解题方法,包括题目描述、示例、算法思路和代码实现,旨在解决将新区间插入有序且不重叠的区间列表中,并合并重叠区间的问题。
117 0
Leetcode第57题(插入区间)
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
126 0
Leetcode第十七题(电话号码的字母组合)
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
110 0
【LeetCode 11】242.有效的字母异位词

热门文章

最新文章