题目:
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
S的长度在[1, 500]之间。
S只包含小写字母 'a' 到 'z' 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-labels
思路:
1、先遍历一遍所有字符,记录下每个字符在字符串中最远的位置,记录在 map 中
2、再次遍历字符串,若是当前字符 a 的位置 index == map.get(a) 时,且 当前位置前面的其他字符的最远位置小于 map.get(a) 时,进行截断,记录截断后的字符长度,
并继续遍历剩下的字符
Java代码如下:
class Solution {
public List<Integer> partitionLabels(String S) {
Map<Character,Integer> map = new HashMap<>(); // 记录每个字符出现的最远的位置
for(int i=0;i<S.length();i++){
map.put(S.charAt(i),i);
}
List<Integer> result = new ArrayList<>();
int maxIndex = -1;
int lastIndex = -1;
for(int i=0;i<S.length();i++){
int tmpMaxIndex = map.get(S.charAt(i));
maxIndex = maxIndex>tmpMaxIndex?maxIndex:tmpMaxIndex;
if(i == maxIndex){
result.add(maxIndex - lastIndex);
lastIndex = maxIndex;
}
}
return result;
}
}