LeetCode 763.划分字母区间
原创
©著作权归作者所有:来自51CTO博客作者菜籽爱编程的原创作品,请联系作者获取转载授权,否则将追究法律责任
LeetCode 763.划分字母区间题目链接:
https://leetcode-cn.com/problems/partition-labels/
题目描述:
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
1. S的长度在[1, 500]之间。
2. S只包含小写字母 'a' 到 'z' 。
题目分析:
根据题意,每一个字母只能出现在同一个片段里面,所以同一个字母开始出现的下标和最后一次出现的下标都必须在同一个片段里面,我们可以先遍历字符串,获取每个字母最后一次出现的下标位置。然后用双指针思想从左到右遍历字符串,获取当前字母最后一次出现的下标位置作为尾指针指向的位置,当前片段结束下标一定不会小于尾指针指向的位置,因此尾指针取当前值和当前字母最后一次出现的下标位置的最大值。得到一个片段,算出此片段长度,把结果放入结果集,最后把首指针指向截取后剩下字符串的第一个字符,循环操作即可。
题解:
执行用时: 4 ms
内存消耗: 36.9 MB
class Solution {
public List<Integer> partitionLabels(String S) {
// 定义数组存放每个字母最后一次出现的下标
int[] lastIndex = new int[26];
// 获取字符串长度
int length = S.length();
// 遍历整个字符串取得每个字母最后一次出现的下标
for (int i = 0; i < length; ++i)
lastIndex[S.charAt(i) - 'a'] = i;
// 创建List集合存放返回结果
List<Integer> list = new ArrayList<>();
// 定义变量存放首尾指针位置
int start = 0, end = 0;
// 遍历字符串
for (int j = 0; j < length; ++j) {
// 尾指针指向此字符最后出现的位置
end = Math.max(end, lastIndex[S.charAt(j) - 'a']);
// 当访问到尾指针指向的位置时,当前片段访问结束,切断字符串
if (j == end) {
// 求出此段字符串长度,放入结果集
list.add(end - start + 1);
// 首指针指向下一段字符串开头
start = end + 1;
}
}
// 返回结果集
return list;
}
}
题目来源:力扣(LeetCode)