非独立思考

    1. class Solution {
    2. public List<Integer> partitionLabels(String s) {
    3. // 首先需要遍历,记录每个字符最后一次出现的下标
    4. int[] last = new int[26];
    5. for (int i = 0; i < s.length(); i++) {
    6. last[s.charAt(i) - 'a'] = i;
    7. }
    8. // 存放结果
    9. List<Integer> res = new ArrayList<>();
    10. int start = 0, end = 0;
    11. // 重新遍历
    12. // 针对每个出现的字符,先得到其最后出现的位置Y
    13. // 那么当前片段由于存在这个字符,那么其当前片段的下标一定不会小于Y:end=max(end,Y)
    14. // 访问到end时,当前片段结束。因为不管是否更新了新值,end一定时末尾
    15. // 当前片段结束,同时将end加入结果集,start = end + 1,继续后面的迭代直到结束。
    16. for (int i = 0; i < s.length(); i++) {
    17. // 进来肯定先判断当前字符的end
    18. int curCharEnd = last[s.charAt(i) - 'a'];
    19. end = Math.max(curCharEnd, end);
    20. if (i == end) {
    21. // 当前结束
    22. res.add(end - start + 1);
    23. start = end + 1;
    24. }
    25. }
    26. return res;
    27. }
    28. }