给你一个字符串 s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s
。
返回一个表示每个字符串片段的长度的列表。
输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
示例 2:
输入:s = "eccbbbbdec"
输出:[10]
提示:
1 <= s.length <= 500
s
仅由小写英文字母组成763. 划分字母区间 - 力扣(LeetCode)
class Solution {
/**
2024年8月25日12:56:44
第一遍遍历的时候,用map记录下每个字符的最大下标;
第2遍遍历的时候,更新当前片段的最大下标位置,如果i到了这个位置,
这个片段结束了,把这个片段的长度放到结果数组里
*/
public List<Integer> partitionLabels(String s) {
// 每个字符出现的最大下标
Map<Character,Integer> cMap=new HashMap<>();
for(int i=0;i<s.length();i++){
cMap.put(s.charAt(i),i);
}
// 当前片段起始下标
int start=0;
// 当前片段最大下标范围,闭区间
int currentLimit=0;
List<Integer> res=new ArrayList<>();
for(int i=0;i<s.length();i++){
currentLimit=Math.max(cMap.get(s.charAt(i)),currentLimit);
// 到达当前片段的最大下标 或者 到数组最后一个字符了,就可以结束了
if(i==currentLimit || i>=s.length()-1){
res.add(i-start+1);
start=i+1;
}
}
return res;
}
}