力扣:763.劃分字母區間

zaleppy發表於2020-10-23

763.劃分字母區間

問題描述:字串 S 由小寫字母組成。我們要把這個字串劃分為儘可能多的片段,同一字母最多出現在一個片段中。返回一個表示每個字串片段的長度的列表。

同一個字母最多出現在一個片段中

方法一:貪心演算法與雙指標
1.從左到右遍歷字串,遍歷的同時維護當下的字串記錄開始的位置和結束的位置,標記為start和end。初始時候start==end。
2.對於每一個訪問到的字母c,得到當前的字串的初始末尾end,然後繼續遍歷,記錄當前字母出現的最後一個位置end©,當前訪問的字母的結束片段,所以令end=max(end,end©)
3.當訪問到下標end時,當前的片段訪問結束,當前片段的下標是[start,end],長度end-start+1,然後返回end,繼續遍歷下一個片段。
重複上述過程直到遍歷結束。

int *partitionLabels(char *S,int *returnSize){
     int last[26];
     int length=strlen(S);
     for(int i=0;i<length,i++){
        last[S[i]-'a']=i;       //忘了網友給的解釋了,大概是拿ASSIC碼減了得到下標吧。
     }
     int *partition=malloc(sizeof(int)*length);
     int start=0,end=0;
     *returnSize=0;
     for(int i=0;i<length;i++){
        end=fmax(end,last[S[i]-'a']);
        if(i==end){
           partition[(*returnSize)++]=end-start+1;
           start=end+1
        }
     }
     return partition;
}

時間複雜度
O(n);需要遍歷兩次字串,第一次記錄每個字母出現的下表的位置,第二次遍歷時就行字串的劃分。
空間複雜度
O(26)

相關文章