贪心算法---划分字母区间

题目:

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

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

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

思路:非贪心思路

先遍历一遍字符串记录所有字母最后出现的下标,再遍历一遍字符串更新字符出现的最远下标,如果找到字符最远出现的位置下标和当前下标相等,则找到了分割点。

代码:

java 复制代码
    public List<Integer> partitionLabels(String s) {
        int hash[]=new int[26];//记录每个字符的最后一次出现的下标
        List<Integer> result=new LinkedList<>();//记录最后的结果
        char[] chars=s.toCharArray();
        for(int i=0;i<chars.length;i++){
            hash[chars[i]-'a']=i;
        }
        int left=0;//记录区间的左边界
        int right=0;//记录区间的右边界
        for(int i=0;i<chars.length;i++){
            right=Math.max(right,hash[chars[i]-'a']);//更新区间的最右边界
            if(i==right){
                result.add(right-left+1);//将该区间的长度加入结果集
                left=i+1;//更新下一个区间的左边界
            }
        }
        return result;
    }
相关推荐
山甫aa20 小时前
差分数组 ----- 从零开始的数据结构
数据结构
早日退休!!!20 小时前
《数据结构选型指南》笔记
数据结构·数据库·oracle
Beginner x_u20 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
丑八怪大丑20 小时前
Java数据结构与集合源码
数据结构
_深海凉_1 天前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
旖-旎1 天前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰1 天前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx1 天前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先
AIFarmer1 天前
【无标题】
开发语言·c++·算法
AGV算法笔记1 天前
CVPR 2025 最新感知算法解读:GaussianLSS 如何用 Gaussian Splatting 重构 BEV 表示?
算法·重构·自动驾驶·3d视觉·感知算法·多视角视觉