马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目配景
给你一个字符串 s s s。我们要把这个字符串分别为尽可能多的片断,同一字母最多出如今一个片断中。
注意,分别效果必要满意:将所有分别效果按次序毗连,得到的字符串仍然是 s s s。
返回一个表现每个字符串片断的长度的列表。
数据束缚
● 1 ≤ s . l e n g t h ≤ 500 1 \le s.length \le 500 1≤s.length≤500
● s s s 仅由小写英笔墨母组成
解题过程
看到频率和子串,一开始想的是滑窗搭配哈希表,实际上并不是很好实现。
比力好的做法是,找到所有字母第一次和最后一次出现的位置,把这个题目看作 归并区间。
每个字母第一次和最后一次出现的位置会框定一个范围,这些范围里还会包含其它字母,也就产生了重叠区间。为了使得同一字母最多出如今一个片断中,这些重叠区间是必要归并的。
而标题又要求分别为尽可能多的片断,就不应该进一步地实验归并区间了,以是上述处理完的区间长度就是终极效果。
详细实现
- class Solution {
- public List<Integer> partitionLabels(String s) {
- char[] chS = s.toCharArray();
- int n = chS.length;
- // 统计每一个字母最后一次出现的位置
- int[] lastIndex = new int[26];
- for (int i = 0; i < n; i++) {
- lastIndex[chS[i] - 'a'] = i;
- }
- List<Integer> res = new ArrayList<>();
- for (int i = 0, left = 0, right = 0; i < n; i++) {
- // 更新当前有边界的要求
- right = Math.max(right, lastIndex[chS[i] - 'a']);
- // 访问到当前的有边界时,说明已经完成了区间合并,添加结果并移动左边界指针
- if (i == right) {
- res.add(right - left + 1);
- left = i + 1;
- }
- }
- return res;
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |