力扣HOT100之贪心算法:763. 划分字母区间
这道题之前刷代码随想录的时候做过,现在回过头来做,又不记得了😅。回去看了下代码随想录的视频才写出来,感觉这道题和之前的45.跳跃游戏Ⅱ的思路很像。
我们首先用一个哈希表来统计每个字母出现的最大下标,这里我们定义一个长度为26
的vector<int> hash
,然后我们遍历字符串,执行hash[s[i] - 'a'] = i
,即可不断更新最大下标。
在更新完字符串s
中的所有字符出现的最大下标后,我们再用一个for
循环来遍历字符串,我们定义result
,current
和next
,result
用来存放每段字符串的长度,current
代表一段字符串的起始下标,初始化为0
,next
代表一段字符串的终止下标,也初始化为0
。当我们遍历字符串s
的时候,不断更新这段字符串的最大覆盖范围,即next = max(next, hash[s[i] - 'a']);
,当i == next
时,说明我们已经遍历到了此段字符串的末尾,我们需要收获结果,直接将next - current + 1
添加到result
中,然后我们再更新下一段字符串的起点current = next + 1;
,然后进行下一段字符串的统计,当遍历完整个字符串s
时,返回最终的结果。
class Solution {
public:vector<int> partitionLabels(string s) {vector<int> hash(26, 0); //统计每一种字符出现的最远下标vector<int> result;for(int i = 0; i < s.size(); i++)hash[s[i] - 'a'] = i;int next = 0; //记录划分区间的最右端int current = 0; //记录划分区间的最左端for(int i = 0; i < s.size(); i++){next = max(next, hash[s[i] - 'a']); //不断更新区间的右端点if(i == next){ //到达一个区间的最右端,需要收获结果result.push_back(next - current + 1);current = next + 1; }}return result;}
};