【算法四十一】763. 划分字母区间

763. 划分字母区间

贪心:

java 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> ans = new ArrayList<>();
        int len = s.length();
        char[] chars = s.toCharArray();

        //记录每一个片段开始的下标
        int end = 0;
        int start = 0;
        
        //用一个数组记录每一个字母出现的最晚下标
        int[] last = new int[26];
        for(int i = 0;i<len;i++){
            last[chars[i] - 'a'] = i;
        }

        //遍历字符串,找片段
        for(int j = 0;j<len;j++){
            //记录当前片段的最近下标
            end = Math.max(end,last[chars[j] - 'a']);
            if(j == end){
                ans.add(end-start+1);
                start = end+1;
            }
        }
        return ans;
    }
}

时间复杂度:O(N)

空间复杂度:O(∣Σ∣),其中 Σ 是字符串中的字符集。这道题中,字符串只包含小写字母,因此 ∣Σ∣=26

思路:要求是每个片段要包含片段中出现字符在字符串的最后一个,那循环到每个字符该怎么判断当前字符是不是字符串中的最后一个呢,用数组来保存每个字符对应的最晚下标,如果不是,那就延长片段

相关推荐
萧西待水1 小时前
奥赛一本通 1447 靶形数独
算法·深度优先
泯泷3 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm3 小时前
34 合并K个升序链表
javascript·算法·链表
Navigator_Z5 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
语戚7 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木7 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
这料鬼有毒8 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃9 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm
GreenTea11 小时前
发布 3 天登顶 HN:不生成一个字的模型 Jev,我把它的源码和黑料都扒了一遍
前端·后端·算法
庖丁解牛11 小时前
无穷小不是一个“神秘小数”,而是一场奔向 0 的过程
算法