LeetCode刷题:贪心算法 [763.划分字母区间] - Java版本

 贪心算法:区间问题

只是记录自己的刷题过程,答案参考过多种题解。

如有错误感谢指正!

参考:

① LeetCode 101: A LeetCode Grinding Guide (C++ Version) 作者:高畅 Chang Gao

② 代码随想录 (programmercarl.com) 作者:程序员Carl

题目来源:

题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 (leetcode-cn.com)

763.划分字母区间 (Medium)

一开始找字母的最大边界值这个思路方向对了,但实现 有问题:

Map<Character, Integer> end = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
    end.put(s.charAt(i), i); //key是字母,value是最后一次出现在字符串中的下标
}

在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

可以分为如下两步:

  • 统计每一个字符最后出现的位置。

  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了 分割点

public List<Integer> partitionLabels(String s) {
    List<Integer> list = new LinkedList<>();
    int[] edge = new int[26]; //新建26个字母的存储数组
    char[] chars = s.toCharArray(); //把字符串转为字符数组
    for (int i = 0; i < chars.length; i++) { //统计每一个字符最后出现的位置
    	edge[chars[i] - 'a'] = i; //不同位置对应的字母 = 该字母在已遍历过字符串中最远出现的位置下标
    }
    int index = 0;
    int last = -1;
    for (int i = 0; i < chars.length; i++) {
        index = Math.max(index, edge[chars[i] - 'a']); //找到已遍历过的字符串中,出现过的字母的最远边界
        if (i == index) { //字母在原字符串中的当前下标 == 该字母在已遍历过字符串中最远出现的位置下标,则找到了分割点
            list.add(i - last); //填入字串长度
            last = i; //更新字串开始下标
        }
    }
    return list;
}

猜你喜欢

转载自blog.csdn.net/weixin_51909882/article/details/122165641