✊✊✊🌈大家好!本篇文章将较详细介绍栈的题目763. 划分字母区间
,提供基于哈希表和双指针的解法。代码语言为:C++代码😇。
🎡导航小助手🎡
763. 划分字母区间
🔒1、题目:
给你一个字符串s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s
。返回一个表示每个字符串片段的长度的列表。
🌲 示例 1🌲:
输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
🌲 示例 2🌲:
输入:s = "eccbbbbdec"
输出:[10]
❗️ 提示 ❗️ :
- 1 <=
s.length
<= 500 s
仅由小写英文字母组成
来源:力扣(LeetCode)👈
☀️2、思路:
划分区间,与45. 跳跃游戏 II类似,每个字母最多只能出现在一个区间内,等同于区间内字母的最后一次出现的位置小于区间最右侧。
1.构建哈希表,可以利用数组构建。循环遍历字符串
s
,记录下每个字母最后出现的位置。
2.初始化区间左右两端l
和r
,遍历字符串,根据当前字母最后一次出现的位置更新r=max(r,当前字母最后一次出现的位置)
。
3.遍历到区间右侧时,区间结束,将区间左侧l更新为r+1
。区间长度r-l+1
存入结果。
复杂度分析:
⏳时间复杂度
O
(
n
)
O(n)
O(n):两次遍历字符串s
🏠空间复杂度
O
(
1
)
O(1)
O(1)
🔑3、代码:
class Solution {
public:
vector<int> partitionLabels(string s) {
int last[26];
int n = s.size();
for(int i = 0; i < n; i++)
last[s[i] - 'a'] = i;
vector<int> ans;
int l = 0, r = 0;
for(int i = 0; i < n; i++){
r = max(r, last[s[i]-'a']);
if(i == r){
ans.emplace_back(r - l + 1);
l = r + 1;
}
}
return ans;
}
};