划分字母区间【763】

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

示例 1:

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

提示:

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

思路

思路解析:当前取的片段不难看出都是某个字段的最后一个值,所以我们先把最后一个值得下标保存起来,因为每个字母要求最多出现在一个片段中,这里我们设置开始begin=0,
从第一个开始,截止字段为last,设置最后的断点值,当last==j时,j前的所有字符都在该片段中j就是断点,剩下的就是判断字段长度了,last - begin + 1,j + 1代表从
当前位置的下一个开始,继续比对

代码

class Solution {
    public List<Integer> partitionLabels(String S) {

        List<Integer> count = new ArrayList();
        char[] chars = S.toCharArray();
        Map<Character, Integer> map = new HashMap();
        int leng = chars.length;

        for(int i =0; i < leng; i++){
            map.put(chars[i], i);    
        }

        int last = -1;
        int begin = 0;

        for(int j = 0; j < leng; j++){
            char c = chars[j];
            if(map.get(c)>last){
                last = map.get(c);
            }
            if(last == j){
                count.add(last - begin + 1);
                begin = j + 1;
            }
        }
        return count;
    }
}
原文地址:https://www.cnblogs.com/snail-gao/p/13861862.html