
算法:
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。
此时前面出现过所有字母,最远也就到这个边界了。
步骤:
- 统计每一个字符最后出现的位置
- 从头遍历字符,
- 并更新字符的最远出现下标,
- 如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

正确代码:
class Solution {
public List<Integer> partitionLabels(String s) {
LinkedList<Integer> result = new LinkedList<>();
char[] chars = s.toCharArray();
int[] location = new int[26];
int index = 0;
int last = -1;
//统计每个字母出现的位置(对应的索引值)
for (int i=0; i < chars.length;i++){
location[chars[i]-'a'] = i;//记录每个字母最后出现的索引值
}
for (int i=0; i < chars.length;i++){
//更新字符的最远出现下标
index = Math.max(index,location[chars[i]-'a']);
//如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
if (index == i){
result.add(index-last);
last = i;
}
}
return result;
}
}
注意:
1.LinkedList<Integer> result = new LinkedList<>(); 要写Integer,不能写int!
在 Java 中,`Integer` 是一个类,而 `int` 是一个原始数据类型。如果想要创建一个存储整数的链表,需要使用 `Integer` 而不是 `int`。这是因为泛型不支持使用原始数据类型。
2.char[] chars = s.toCharArray(); char[] c要小写!
3.chars.length,不能写chars.length()
(1)对于数组(如 `int[]`、`char[]` 等),应该使用 `.length` 来获取数组的长度,因为数组是一个对象,它具有一个公共字段来存储其长度。(属性)
int[] numbers = {1, 2, 3, 4, 5};
int length = numbers.length;
(2)对于字符串(如 `String` 对象),应该使用 `.length()` 方法来获取字符串的长度,因为字符串是一个对象,它具有一个 `length()` 方法来返回其字符序列的长度。(方法)
String str = "Hello, World!";
int length = str.length();
(3)`.size()` 方法通常用于集合类(如 `List`、`Set`、`Map` 等),以获取它们所包含元素的数量。
举例来说,对于 `ArrayList`、`LinkedList`、`HashSet`、`TreeSet` 等集合类,你应该使用 `.size()` 方法来获取它们所包含元素的数量。
ArrayList<String> list = new ArrayList<>();
int size = list.size();
另外,对于 `Map` 接口的实现类(如 `HashMap`、`TreeMap` 等),也可以使用 `.size()` 方法来获取它们所包含的键值对的数量。
HashMap<String, Integer> map = new HashMap<>();
int size = map.size();
时间空间复杂度:
- 时间复杂度:O(n)
- 空间复杂度:O(1),使用的hash数组是固定大小














![[每日一题] 01.27 - 斐波那契数列](https://img-blog.csdnimg.cn/direct/e42ebcd454a54210b4d9a05bd7462015.png)



