筷子与饺子
Published on 2019-11-11 04:08 in 暂未分类 with 筷子与饺子

LeetCode_763. 划分字母区间

LeetCode_763. 划分字母区间

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

提示:
S的长度在[1, 500]之间。
S只包含小写字母 'a' 到 'z' 。

思路

嗐,看了解析
使用一次循环遍历把每一个字符出现的最晚位置存储下来。
再使用一次遍历
对于每个访问到的字母,可以得到这个字母最后出现的位置 end,那么该字母存在的分段的位置是肯定大于等于 end的。所以 end = max(end,last[S[i]-'a'])
当访问到end 的时候,说明当前分段访问结束。
然后使start = end + 1,继续寻找。

code

class Solution {
public:
    vector<int> partitionLabels(string S) {
       int last[26];
       int length = S.size();

       //遍历一边字符串 找到每一个字符最晚出现的位置
       for(int i =0;i<length;i++)
       {
           last[S[i] - 'a'] = i;
       }
       
       vector<int> partition;
       int start = 0,end =0;
       for(int i = 0;i<length;i++)
       {
           end = max(end,last[S[i]-'a']);
           if(i ==end)
           {
                partition.push_back(end-start+1);
                start = end + 1;
           }
            
       }
       return partition;

    }   
};

链接

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-labels

posted @ 2020-10-22 13:12  筷子与饺子  阅读(75)  评论(0编辑  收藏  举报