貪心思想之字串切分
阿新 • • 發佈:2018-12-06
先從第一個字元開始,找到最後一次該字元出現的位置,然後判斷包含在這個範圍之內的字元是否滿足最後一次出現的位置<=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; } }