【算法四十一】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

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

相关推荐
Nil2088 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
wanderist.10 小时前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.10 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791310 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂11 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
光影少年11 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
HEJOO911 小时前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法
Code_Solitude11 小时前
c语言:递归
java·c语言·算法
edtoplort12 小时前
OpenAI紧急叫停GPT-6.1 Astra训练,奥尔特曼为何踩刹车
人工智能·gpt·算法
蒜香可达鸭12 小时前
让视频生成流水线跑不崩:一个事件溯源的多 Agent 可靠执行框架
算法