给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"] 或 ["ab", "ab", "cc"] 的划分是非法的。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。示例 1:
输入:s = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
示例 2:
输入:s = "eccbbbbdec" 输出:[10]
提示:
1 <= s.length <= 500s仅由小写英文字母组成
题解:
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> result = new ArrayList<>();
//贪心,记录每个字母最后出现的索引,遍历时实时更新最大索引,如果相等那就代表这是一个片段
int[] nums = new int[26];
for(int i = 0;i<s.length();i++){
nums[s.charAt(i)-'a'] = i;
}
int start = 0,end = 0;
for(int i = 0;i<s.length();i++){
end = Math.max(nums[s.charAt(i)-'a'],end);
if(end == i){
int length = end - start + 1;
result.add(length);
start = end + 1;
}
}
return result;
}
}

