题目:
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例:
image.png
思路:
第一步:
先遍历一遍,用字典存储每个字符最后的位置。
第二步:
从第一个字符开始遍历,每获取一个字符就该字符最后一次出现的位置索引定为当前片段的最后位置,
在达到该位置之前,继续寻找更靠后的最后位置,若达到最后位置之前都没有发现更靠后的最后位置,则将当前最后位置作为一个片段的末尾,
作者:xiao-ma-9
链接:https://leetcode-cn.com/problems/partition-labels/solution/map-jia-tan-xin-jian-dan-you-xiao-shi-jian-fu-za-d/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码:
//使用字典存储字符的最后一个位置
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> list = new ArrayList<Integer>();
Map<Character, Integer> Map = new HashMap<>();
int len = S.length();
int nowIndex = 0;
int Slen = 0;
for (int i = 0; i < len; i++) {
Map.put(S.charAt(i), S.lastIndexOf(S.charAt(i)));
}
for (int i = 0; i < len; i++) {
if (Map.get(S.charAt(i)) > nowIndex) {
nowIndex = Map.get(S.charAt(i));
}
if (i == nowIndex) {
list.add(nowIndex + 1 - Slen);
Slen = nowIndex + 1;
}
}
return list;
}
}
//使用数组存储字符的最后一个位置
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> list = new ArrayList<Integer>();
int[] lastIndex = new int[26];
int len = S.length();
int nowIndex = 0;
int Slen = 0;
for (int i = 0; i < len; i++) {
lastIndex[S.charAt(i) - 'a'] = i;
}
for (int i = 0; i < len; i++) {
if (lastIndex[S.charAt(i) - 'a'] > nowIndex) {
nowIndex = lastIndex[S.charAt(i) - 'a'];
}
if (i == nowIndex) {
list.add(nowIndex + 1 - Slen);
Slen = nowIndex + 1;
}
}
return list;
}
}
时间复杂度:O(n),空间复杂度:O(1)