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 。

目录
相关文章
|
18天前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
36 0
|
2月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
5天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
15 2
|
13天前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
11 1
|
13天前
|
算法
Leetcode第57题(插入区间)
LeetCode第57题“插入区间”的解题方法,包括题目描述、示例、算法思路和代码实现,旨在解决将新区间插入有序且不重叠的区间列表中,并合并重叠区间的问题。
14 0
Leetcode第57题(插入区间)
|
13天前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
12 0
Leetcode第十七题(电话号码的字母组合)
|
13天前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
11 0
【LeetCode 11】242.有效的字母异位词
|
16天前
|
算法
条件运算符与条件if的姻缘,打擂台算法和大小写字母转换,if逻辑避坑
条件运算符与条件if的姻缘,打擂台算法和大小写字母转换,if逻辑避坑
13 1
|
12天前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
22 0
|
2月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
57 1
测试工程师的技能升级:LeetCode算法挑战与职业成长