其他分享
首页 > 其他分享> > leetcode 763. 划分字母区间

leetcode 763. 划分字母区间

作者:互联网

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

示例 1:

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

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

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

分析:

比如里面随便一个子串,只要满足了里面的字母在剩下的子串里没有就可以截取下来了。

比如 S = "ababcbacadefegdehijhklij"

其中 "ababcbaca"就可以截取,因为剩下的子串里没有a,b,c,字符了。

怎莫找到这个子串呢, 假如子串区间为(i, j);

从第一个字符a下标0开始我们找到为a的最后一个字符下标为8.区间暂时就为(0,8)

然后遍历他们之间的字符的最后一个字符下标如果大与j就让j更新,

知道里面的最后一个字符的下标都小于j说明这就是一个结果保存然后更新区间

 

class Solution {
    public List<Integer> partitionLabels(String S) {
        List<Integer> res = new ArrayList<>();
        int i=0, j=S.lastIndexOf(S.charAt(0)), len=S.length();//i, j代表一个结果区间
        for(int k=0; k<len; k++){//遍历字符串
            if(k==j){//当k==j时代表i到j的字符串满足题目要求了
                res.add(j-i+1);//添加结果
                if (k!=len-1){//更新i, j区间
                j = S.lastIndexOf(S.charAt(k+1));
                i = k+1;
                }
                continue;
            }

            int index = S.lastIndexOf(S.charAt(k));
            if(index>j){//当i, j里有一个字符的最后一个字母的lastIndexOf比j大时更新j
                j = index;
            }

        }

        return res;
    }
}

 

标签:子串,字符,片段,下标,763,字母,划分,leetcode
来源: https://www.cnblogs.com/qiulonghai/p/12345173.html