LeetCode热题100--763. 划分字母区间--中等

题目

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"] 或 ["ab", "ab", "cc"] 的划分是非法的。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = "ababcbacadefegdehijhklij"

输出:[9,7,8]

解释:

划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。

每个字母最多出现在一个片段中。

像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。

示例 2:

输入:s = "eccbbbbdec"

输出:[10]

题解

java 复制代码
class Solution {
    public List<Integer> partitionLabels(String S) {
        char[] s = S.toCharArray();
        int n = s.length;
        int[] last = new int[26];
        for (int i = 0; i < n; i++) {
            last[s[i] - 'a'] = i; // 每个字母最后出现的下标
        }

        List<Integer> ans = new ArrayList<>();
        int start = 0, end = 0;
        for (int i = 0; i < n; i++) {
            end = Math.max(end, last[s[i] - 'a']); // 更新当前区间右端点的最大值
            if (end == i) { // 当前区间合并完毕
                ans.add(end - start + 1); // 区间长度加入答案
                start = i + 1; // 下一个区间的左端点
            }
        }
        return ans;
    }
}

解析

出自:本质是合并区间,简洁写法(Python/Java/C++/C/Go/JS/Rust)

java 复制代码
class Solution {  //定义一个新的解决方案类
    public List<Integer> partitionLabels(String S) {   //partitionLabels是接收字符串S的方法
        char[] s = S.toCharArray();  //将输入的字符串转换为字符数组's'
        int n = s.length;  //获取字符串的长度'n'并保存到变量中
			         int[] last = new int[26];   //初始化一个大小为26的整型数组,表示英文字母表中的每个字母的索引。这个将用于获取最后出现的下标值
        for(int i = 0; i < n; i++) {  //循环遍历整个s数组
            last[s[i] - 'a'] = i;   //每次迭代时,更新字符在输入字符串中的索引位置。这里通过计算字母在英文字母表中的索引值来实现。比如在最后出现了'd'字符,就找到了它的最远索引
        }
			 List<Integer> ans = new ArrayList<>();  //初始化一个空的数组列表以存储最终答案
        int start = 0, end = 0;   //定义变量start和end为区间的起点和终点。这两个点表示可能包含最多不重复字母的子串/区间,即我们要找的划分/区间
			 for(int i = 0; i < n; i++) {  //再次从头开始循环遍历整个s数组。这个循环用于确定每个可能区间的结束点
            end = Math.max(end, last[s[i] - 'a']);  //当前字母/字符的最后出现的位置和已经迄今为止找到的最远位置(比如'd'在这里表示一个子串中的最大索引,它将一直增加直到达到所有部分或数组末尾)
			 if(end == i) {  //如果当前确定的区间(从start到end之间包括这两个点)结束的位置等于当前迭代器'i'表示的字符,意味着没有重复/公共字母存在。因为在给定子串中只有这个部分包含所有唯一字母
                ans.add(end - start + 1);  //将长度加入答案列表(end-start+1,因为在Java中数组索引从0开始)
                start = i + 1;  //移动到下一个区间的起点。'i +1'确保我们向前移动一步到达下一个字母/字符的位置,并成为新的区间或子串的起始点
             }  
         }    
相关推荐
2301_765703146 小时前
C++中的职责链模式实战
开发语言·c++·算法
StandbyTime6 小时前
《算法笔记》学习记录-第一章
c++·算法·算法笔记
近津薪荼6 小时前
优选算法——双指针8(单调性)
数据结构·c++·学习·算法
格林威6 小时前
Baumer相机铆钉安装状态检测:判断铆接是否到位的 5 个核心算法,附 OpenCV+Halcon 的实战代码!
人工智能·opencv·算法·计算机视觉·视觉检测·工业相机·堡盟相机
星空露珠6 小时前
速算24点检测生成核心lua
开发语言·数据库·算法·游戏·lua
happygrilclh7 小时前
高压高频电源的pid算法
算法
格林威7 小时前
Baumer相机铸件气孔与缩松识别:提升铸造良品率的 6 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·opencv·算法·安全·计算机视觉·堡盟相机·baumer相机
葫三生7 小时前
存在之思:三生原理与现象学对话可能?
数据库·人工智能·神经网络·算法·区块链
Evand J7 小时前
【MATLAB例程】无人机三维路径规划|A*,RRT(快速随机树算法), APF(人工势场法)算法对比|可自定义起终点、障碍物坐标。附下载链接
算法·matlab·无人机·astar·路径规划·rrt·apf
少许极端7 小时前
算法奇妙屋(二十七)-全排列与子集问题
算法·剪枝·回溯·递归