1. 程式人生 > >貪心思想之字串切分

貪心思想之字串切分

 先從第一個字元開始,找到最後一次該字元出現的位置,然後判斷包含在這個範圍之內的字元是否滿足最後一次出現的位置<=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;
    }
}