763. 划分字母区间

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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-labels


思路:

在这串字符串中,开头为a,找到的区间至少结尾为最后一个a

但是中间会出现一些干扰元素,比如b,而如果b在上面找到的结尾a的前面那就无所谓

如果在后面则要更新当前结尾为a的区间范围,一直包含到最后结尾为b的区间处

所以对于每一个字符都必须先找到最后结尾的位置的下标处并记录下来

再两个变量,一个用来更新区间,一个用来记录下标位置

class Solution {
    public List<Integer> partitionLabels(String S) {
        //定义一个数组,用来存储每个字符最后出现的位置下标
        int[] last = new int[26];
        for (int i = 0; i < S.length(); i++) {
            last[S.charAt(i) - 'a'] = i;
        }
        //记录完了之后需要两个变量,一个用来更新区间,一个用来记录新区间的下标
        int j = 0, count = 0;
        //定义一个List用来存放分割出来的区间并返回
        List<Integer> arr = new ArrayList<>();
        for (int i = 0; i < S.length(); i++) {
            j = Math.max(j,last[S.charAt(i) - 'a']);
            //如果i = j 则说明这段区间这就是要找的区间
            if ( i == j){
                arr.add(i - count + 1);
                count = i + 1;
            }
        }
        return arr;
    }
}
原文地址:https://www.cnblogs.com/zzxisgod/p/13339106.html