算法:
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。
此时前面出现过所有字母,最远也就到这个边界了。
步骤:
- 统计每一个字符最后出现的位置
- 从头遍历字符,
- 并更新字符的最远出现下标,
- 如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
正确代码:
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数组是固定大小