贪心算法

划分字母区间

中等#763Java时间 O(n)空间 O(26),不含输出

题目要做什么

将小写字符串划分为尽可能多的连续片段,使每个字母只出现在一个片段中。返回每个片段的长度。

题目示例输入s = "ababcbacadefegdehijhklij"
题目示例输出[9,7,8]

01 为什么这样做

先记录每个字母最后出现的位置。扫描一个片段时,不断扩展 end 到已见字母的最晚位置;当 i = end 时,当前片段可以结束。

始终成立的条件

当前片段内已经遇到的字母,其全部出现位置都不超过 end。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public List<Integer> partitionLabels(String s) {3        int[] last = new int[26];4        for (int i = 0; i < s.length(); i++) last[s.charAt(i) - 'a'] = i;5        List<Integer> ans = new ArrayList<>();6        int start = 0, end = 0;7        for (int i = 0; i < s.length(); i++) {8            end = Math.max(end, last[s.charAt(i) - 'a']);9            if (i == end) {10                ans.add(end - start + 1);11                start = i + 1;12            }13        }14        return ans;15    }16}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索