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