leetcode 763. Partition Labels | 763. 划分字母区间(双指针)

x33g5p2x  于2021-12-01 转载在 其他  
字(0.7k)|赞(0)|评价(0)|浏览(280)

题目

https://leetcode.com/problems/partition-labels/

题解

将问题转化成线段分割问题:找到所有可以切的点,使得每一个线段都不会被切到

  1. class Solution {
  2. public List<Integer> partitionLabels(String s) {
  3. int[][] range = new int[26][2];
  4. for (int i = 0; i < 26; i++) {
  5. range[i][0] = -1;
  6. range[i][1] = -1;
  7. }
  8. for (int i = 0; i < s.length(); i++) {
  9. int p = s.charAt(i) - 'a';
  10. if (range[p][0] == -1) range[p][0] = i;
  11. range[p][1] = i;
  12. }
  13. Arrays.sort(range, (o1, o2) -> {
  14. if (o1[0] == o2[0]) return o1[1] - o2[1];
  15. else return o1[0] - o2[0];
  16. });
  17. List<Integer> result = new ArrayList<>();
  18. int start = -1;
  19. int end = -1;
  20. for (int[] r : range) {
  21. if (r[0] == -1) {
  22. continue;
  23. } else if (start == -1) {
  24. start = r[0];
  25. end = r[1];
  26. } else {
  27. if (r[0] > start && r[0] < end) {
  28. end = Math.max(end, r[1]);
  29. } else {
  30. result.add(end - start + 1);
  31. start = r[0];
  32. end = r[1];
  33. }
  34. }
  35. }
  36. result.add(end - start + 1);
  37. return result;
  38. }
  39. }

相关文章