力扣:763.划分字母区间

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)

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页