题目:
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
class Solution {
public:
// 方法一::用count来记录字符个数
// vector<int> partitionLabels(string s)
// {
// vector<int> result;
// if(s.size() == 0) return result;
// int arr[26] = {0}; // 数组 arr 定义并初始化,这个需要背一下~
// int end = INT_MIN;
// int count = 0;
// // 统计每一个字符出现的最后一个下标,将 0-26 与字符 a-z 一一映射
// for(int i = 0; i < s.size(); i++)
// {
// arr[s[i] - 'a'] = i;
// }
// for(int i = 0; i < s.size(); i++)
// {
// // 注意 这个更新 end 和 count++ 的过程是一进入for循环就开始的
// // 我第一次分析有误,把它们放在了 if-else 的判断中,这就次数就不对了
// end = max(end, arr[s[i] - 'a']);
// count++;
// if(i == end)
// {
// result.push_back(count);
// count = 0;
// }
// }
// return result;
// }
// 方法二::定义左右边界来统计字符个数
vector<int> partitionLabels(string s)
{
vector<int> result;
if(s.size() == 0) return result;
int arr[26] = {0}; // 数组 arr 定义并初始化,这个需要背一下~
int left = 0;
int right = 0;
// 这种方法与 end count 基本一样,都是需要维护更新两个变量
for(int i = 0; i < s.size(); i++)
{
arr[s[i] - 'a'] = i;
}
for(int i = 0; i < s.size(); i++)
{
right = max(right, arr[s[i] - 'a']);
if(i == right)
{
result.push_back(right - left + 1);
left = i + 1;
}
}
return result;
}
};