贪心思想之字符串切分

 先从第一个字符开始,找到最后一次该字符出现的位置,然后判断包含在这个范围之内的字符是否满足最后一次出现的位置<=lastIndex,不满足要进行重新更新lastindex;直到所有的字符都在lastindex范围之内

class Solution {
    public List<Integer> partitionLabels(String S) {
        /*按照字符最后一次出现的位置进行划分,如果下一个字符最后一次出现的位置
//在当前lastindex的里面,就不划分片段,如果不在,就从lastindex开始划分*/
        //1.先定义26个字符出现的最后一次索引位置
        int[] lastmap=new int[26];
        //2.把最后一次出现的位置都存储进去
        for(int i=0;i<S.length();i++){
            lastmap[S.charAt(i)-'a']=i;
        }
        List<Integer> res=new ArrayList<>();
        //3.开始查找满足条件的选择
        int firstIndex=0;
        while(firstIndex<S.length()){
            int lastIndex=firstIndex;
            //ababcabcc||a最后一次出现的位置5,但是c最后一次出现的位置大于5,
            //因此要更新lastIndex为c最后一次出现的位置;然后让lastindex里面的字符最后一次出现的位置都<=lastIndex;
            //作为一次切分
            for(int i=firstIndex;i<S.length()&&i<=lastIndex;i++){
                //4.求出每个字符最后一次出现的位置
               int index=lastmap[S.charAt(i)-'a'];
                //5.判断--找出每个字符最后一次出现的位置
                if(index>lastIndex){
                    lastIndex=index;
                }
            }
            //满足上述条件之后,重新开始划片
           res.add(lastIndex-firstIndex+1);
            firstIndex=lastIndex+1;
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31957639/article/details/83857295