题目描述
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例
示例:
输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-labels
实现
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
// 建立map,保存每个字母最后出现的位置
int* partitionLabels(char *s, int *returnSize)
{
int len = strlen(s);
*returnSize = 0;
if (strlen(s) == 1) {
*returnSize = strlen(s);
return returnSize;
}
int map[26] = {0};
for (int i = 0; i < len; i++) {
map[s[i]-'a'] = i;
}
int *res = (int*)malloc(sizeof(int) * strlen(s)); // 保存结果数组。
memset(res, 0, strlen(s));
int end = 0; // 保存片段尾部
int start = 0; // 保存每个片段的开始
// 遍历,找到最小的片段
for (int i = 0; i < strlen(s); i++) {
if (map[s[i]-'a'] > end) {
end = map[s[i]-'a'];
}
if (i == end) { // 找到片段
res[(*returnSize)++] = end - start + 1;
start = end + 1; // 新的片段的起始位置
}
}
return res;
}