LeetCode763-划分字母区
题目
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。
解法
class Solution {
public List<Integer> partitionLabels(String S) {
//保存S字符串中的每个字符的最后位置
int[] last = new int[26];
int length = S.length();
for (int i = 0; i < length; i++) {
last[S.charAt(i) - 'a'] = i;
}
List<Integer> partition = new ArrayList<Integer>();
int start = 0, end = 0;
for (int i = 0; i < length; i++) {
//到目前为止,所有出现过的字符最后一位的位置
end = Math.max(end, last[S.charAt(i) - 'a']);
//每次检查i是不是等于end,若等于end,则说明start到end之间的字符不在其他地方出现
if (i == end) {
partition.add(end - start + 1);
start = end + 1;
}
}
return partition;
}
}