1. 解法
在示例1中,根据贪心策略,只要第一段有a,那么第一段就要包含原字符串S所有的a,同时又要保证划分的片段尽可能多,则从第一个a到最后一个a就是第一个片段的组成,然后要检查该片段中的其他字母,b和c,发现没有剩余的,那么该片段就是第一个片段。
选第二个片段的时候发现,“defegd“包含了所有d,但是e还有剩余,则把e加进去,变成"defegde”,f和g没有剩余,那么第二个片段就是"defegde"。
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> lenList = new ArrayList<>();
for (int i = 0; i < s.length();) {
char label = s.charAt(i);
int end = s.lastIndexOf(label);
for (int j = i + 1; j < end; j++) {
label = s.charAt(j);
end = Math.max(s.lastIndexOf(label), end);
}
lenList.add(end - i + 1);
i = end + 1;
}
return lenList;
}
}
2. 原题 763. 划分字母区间
给你一个字符串 s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s
。
返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
示例 2:
输入:s = "eccbbbbdec"
输出:[10]
提示:
1 <= s.length <= 500
s
仅由小写英文字母组成