划分字母区间【贪心算法】

  1. 划分字母区间
    给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
    注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。
    在这里插入图片描述
    参考下图:
    1.确定每个元素的最远距离索引
    2.遍历过程若当前索引等于当前遍历路径的最大索引时,说明找到了一个符合要求的子串。

在这里插入图片描述

class Solution {
    
    
    public List<Integer> partitionLabels(String s) {
    
    
        int[] hash = new int[26];//26个字母范围内
        char[] chars = s.toCharArray();//将字符串转化为字符数组,便于遍历操作
        for (int i = 0; i < chars.length; i++) {
    
    
            hash[chars[i] - 'a'] = i;//记录遍历过每个元素出现位置的最远距离对应的下标索引
        } 
        int left = 0;//初始化第一个子串的起点
        int idx = 0;//记录路径上遍历元素最远距离的索引,初始化未0
        LinkedList<Integer> res = new LinkedList<>();//用链表存储有序的整数值
        for (int i = 0; i < chars.length; i++) {
    
    
            idx = Math.max(idx, hash[chars[i] - 'a']);//当前元素最远出现边界,遍历并取当前路径上最大的进行记录
            if (i == idx) {
    
    //找到了符合条件的
                res.add(idx - left + 1);//返回满足条件子串的长度
                left = i + 1;//更新下一个子串的起点
            }
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_47004707/article/details/132626698