Leetcode 763. Partition Labels
A string S of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
Example 1:
Input: S = “ababcbacadefegdehijhklij”
Output: [9,7,8]
Note:
1.S will have length in range [1, 500].
2.S will consist of lowercase letters (‘a’ to ‘z’) only.
题目大意:
给定只包含小写字母的字符串S,要将此字符串分成尽可能多个part,使每个字母最多只出现在一个part,并返回代表这些part的长度列表。
解题思路:
由于每个字母只能出现在一个part,则每个part的长度与每个字母最后出现的位置息息相关,因此,首先建立一个储存每个字母与其最后出现位置的哈希表。接着利用贪心策略,尽可能缩短每个part的长度,增加part的数量。设置两个指针p_start和p_end,分别储存当前切分的part的开头和结尾。遍历S,当前S[i]的最后出现位置即last[S[i]]就是当前part的结尾p_end,因此p_end = max(p_end, last[S[i]]).若当前遍历指针i == p_end,则说明一个最小的part切分完成,储存当前part的长度并更新p_start = i+1。时间复杂度为O(n).
代码:
class Solution {
public:
vector<int> partitionLabels(string S) {
if(S.empty())
return {};
vector<int> last(26, 0);
vector<int> res;
for(int i = 0; i < S.size(); i++)
last[S[i] - 'a'] = i;
int p_start = 0, p_end = 0;
for(int i = 0; i< S.size(); i++)
{
p_end = max(p_end, last[S[i] - 'a']);
if(i == p_end)
{
res.push_back(i - p_start + 1);
p_start = i + 1;
}
}
return res;
}
};