【贪心算法】Leetcode 763. 划分字母区间【中等】

划分字母区间

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

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

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

示例 1:
输入 :s = "ababcbacadefegdehijhklij"
输出9,7,8
解释

划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。

每个字母最多出现在一个片段中。

像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。

解题思路

  • 1、遍历字符串s,记录每个字符最后出现的位置。
  • 2、使用双指针技巧,维护一个区间start, end,表示当前正在处理的片段。
  • 3、遍历字符串s,根据当前字符的最后出现位置,不断更新end指针。
  • 4、当遍历到达end位置时,表示当前片段已经结束,即后面字符没有当前片段中相同的字符。将当前片段的长度添加到结果列表中,并更新start指针为end + 1。
  • 5、重复上述过程,直到遍历完整个字符串s。

Java实现

java 复制代码
public class PartitionLabels {
    public List<Integer> partitionLabels(String s) {
        List<Integer> result = new ArrayList<>();
        Map<Character, Integer> lastIndexMap = new HashMap<>();

        // 记录每个字符最后一次出现的位置
        for (int i = 0; i < s.length(); i++) {
            lastIndexMap.put(s.charAt(i), i);
        }

        int start = 0; // 当前片段的起始位置
        int end = 0; // 当前片段的结束位置

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            end = Math.max(end, lastIndexMap.get(c)); // 更新当前片段的结束位置
            // 如果当前位置等于当前片段的结束位置
            // 即没有相同的字符在后面了,当前字符可以组成一个字符串了
            if (i == end) {
                result.add(end - start + 1); // 将当前片段的长度添加到结果列表中
                start = i + 1; // 更新当前片段的起始位置为当前位置的下一个位置
            }
        }

        return result;
    }

    public static void main(String[] args) {
        PartitionLabels solution = new PartitionLabels();
        String s = "ababcbacadefegdehijhklij";
        System.out.println("Partition labels: " + solution.partitionLabels(s)); // Output: [9, 7, 8]
    }
}

时间空间复杂度

  • 时间复杂度:遍历字符串s,时间复杂度为O(n),其中n为字符串s的长度。

  • 空间复杂度:使用了长度为26的数组lastIndex,空间复杂度为O(1)。

相关推荐
快手技术4 分钟前
征集令|快手探索者LLM-Rec挑战赛正式发布!
算法
Yvonne爱编码19 分钟前
JAVA EE初阶---DAY 2 计算机网络
java·开发语言·计算机网络·算法·java-ee·php
workflower36 分钟前
基于机器学习的设备故障预测分析方法
人工智能·算法·机器学习·设计模式·语言模型·自然语言处理·重构
格发许可优化管理系统41 分钟前
Mentor许可证与其他软件许可证的深度比较
java·大数据·运维·c语言·c++·算法
wjcroom1 小时前
时空和电子7-泡力模型含罗量
人工智能·算法·机器学习
KaMeidebaby1 小时前
卡梅德生物技术快报 | Fab 合成文库构建与抗体筛选实验流程及数据解析
人工智能·python·tcp/ip·算法·机器学习
金融小师妹1 小时前
基于AI事件驱动模型与验证溢价框架的市场分析:从预期交易到事实验证,原油与黄金面临关键定价重构
大数据·人工智能·算法·均值算法·线性回归
xxwl5851 小时前
工作室小测的部分记录
c++·学习·算法
智者知已应修善业1 小时前
【51单片机串口通信甲机四个按键模拟四位二进制值发送乙机以十进制显示2位数码管】2024-6-14
c++·经验分享·笔记·算法·51单片机
KobeSacre1 小时前
划分为k个相等的子集
算法·leetcode·深度优先