[HOT 100]今日一练------划分字母区间

题目链接

https://leetcode.cn/problems/partition-labels/description/?envType=study-plan-v2&envId=top-100-liked

思路

该题我们将使用贪心 算法,贪心策略为:从起点开始,把区间一直扩展到 "当前所有字母最后出现位置最远的那个",到了就切。

此处我们稍微做一下解释,题目中要求说我们要把这个字符尽可能地切割的够短,即组数少,那么我们就应该在保证合法的情况下,使得切点足够的远 ,而由于一种字母只能出现在一组中,因此我们就应该保证切点为这个字母最后一次出现的位置。

综上我们贪就应该贪在,我要保证切点不仅是字母最后一次出现 的位置,还要是在合法情况下所能达到的最远位置,因此我们需要知道:

  1. last\[\]【每一种字母最后一次出现的位置】
  2. end 【合法情况下可以到达的最远位置】
  3. start 【这组区间的起始位置方便求区间长度作为结果】
  4. 当前位置到达end时切割,即此时为合法最远点

代码

java 复制代码
class Solution {
    //贪心:从起点开始,把区间一直扩展到 "当前所有字母最后出现位置最远的那个",到了就切。
    public static List<Integer> res;
    public static int[] chs = new int[26];
    public static int[] last = new int[26];
    public List<Integer> partitionLabels(String s) {
        res = new ArrayList<>();
        //找最后出现位置
        for(int i = 0; i < s.length(); i++) last[s.charAt(i) - 'a'] = i;
        int start = 0;
        int end = 0;
        //贪心找最远切割
        for(int i = 0; i < s.length(); i++) {
            end = Math.max(end, last[s.charAt(i) - 'a']);
            //切割
            if(i == end) {
                res.add(end-start+1);
                start = end + 1;
            }
        }
        return res;
    }
}
相关推荐
lzhdim4 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ7 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one9 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David9 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David10 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪10 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪10 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!12 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.12 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净13 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论