【LeetCode-763】划分字母区间(贪心)

LeetCode763.划分字母区间

题目链接

题目描述

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

示例:

  • 输入:S = "ababcbacadefegdehijhklij"
  • 输出:9,7,8 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

提示:

  • S的长度在1, 500之间。
  • S只包含小写字母 'a' 到 'z'

思想

这个题想要所有出现的字母都在一个范围里面,所以必须是字母的最后的出现位置,而且范围中的所有字母的最后位置都必须在范围内。所以我首先想到的就是先求出字母所有的范围,并且字母一共只有26个,最简单存储且方便拿取的方式就是数组,直接使用26长度的数组进行存储。

找到了每个字母的最后出现位置,接下来我们就可以开始遍历。由于我们最后要将总的长度放到一个list中去,所以可以设置一下start和end。

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

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

代码实现

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

        // 求出每个字母的最后位置
        for (int i = 0; i < len; i++) {
            arr[s.charAt(i) - 'a'] = i;
        }

        int start = 0;
        int end = 0;
        for (int i = 0; i < len; i++) {
            end = Math.max(arr[s.charAt(i) - 'a'], end);
            
            if (end == i) {
                list.add(end - start + 1);
                start = end+1;
            }
        }

        return list;
    }
}
相关推荐
zcmodeltech6 分钟前
反应装置模型控制系统设计与实现:多设备协同联动方案
java·网络·数据库·stm32·嵌入式硬件·能源·制造
小星星闪亮登场9 分钟前
图论--最小生成树(内含二分图)
数据结构·算法·图论·迭代加深·图搜索算法
码视野17 分钟前
基于 Spring Boot + Vue3 的【城市地下燃气管网微泄漏感知与相邻地下空间燃爆预警中台】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端
ZC跨境爬虫27 分钟前
LeetCode 219. 存在重复元素 II(滑动窗口 + 哈希表详解)
算法·leetcode·散列表
吞下星星的少年·-·37 分钟前
The 2025 ICPC Asia East Continent Online Contest (I) A题(模拟+贪心)
算法·贪心·模拟
2601_9620715738 分钟前
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
java·开发语言·数据库
梦想的旅途240 分钟前
如何高效调用企业微信通讯录API管理组织架构
java·开发语言·企业微信
阿宁学科技术库1 小时前
关于“库库AI”在股票投研场景实用性的技术观察
大数据·人工智能·职场和发展
小程序设计1 小时前
【机械设计】磁粉检测机器人的设计与验证
算法·机器人
Navigator_Z1 小时前
LeetCode //C - 1220. Count Vowels Permutation
c语言·算法·leetcode