字符串 S
由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。示例 1:
输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释: 划分结果为 “ababcbaca”, “defegde”, “hijhklij”。 每个字母最多出现在一个片段中。
像 “ababcbacadefegde”,“hijhklij” 的划分是错误的,因为划分的片段数较少。提示:
S的长度在[1, 500]之间。 S只包含小写字母 ‘a’ 到 ‘z’ 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/partition-labels
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
统计每个字母最右出现的位置到数组right中:
//统计每个字母最右index
int[] right = new int[26];
for(int i = 0; i < S.length(); ++i) {
right[S.charAt(i) - 'a'] = i;
}
然后从左往右遍历字符串,用两个指针。l每到一个位置的时候把r右移到right[l](或者不动)。直到l和r相等就截出了一个字符串,完整代码:
class Solution {
public List<Integer> partitionLabels(String S) {
//统计每个字母最右index
int[] right = new int[26];
for(int i = 0; i < S.length(); ++i) {
right[S.charAt(i) - 'a'] = i;
}
List<Integer> ret = new ArrayList<>();
int l = 0;
while(l < S.length()) {
int r = right[S.charAt(l) - 'a'], l0 = l;
while(l < r) {
++l;
r = Math.max(r, right[S.charAt(l) - 'a']);
}
ret.add(l - l0 + 1);
++l;
}
return ret;
}
}