描述
农场主人有许多牛,他给每只牛都有一个品种名字,品种名字由小写字母组成。农场主人希望将这些牛分成尽可能多的组,每组的牛的品种名字中不能有相同的字母。也就是说,一个字母只能在一个组中出现。注意,分组结果需要满足:将所有分组结果按顺序连接,得到的字符串仍然是原来所有字符串。 给定一个字符串s,表示所有牛的名字,返回一个表示每个牛名片段的长度的列表。
示例1
输入:"aabbccdd"
返回值:[2,2,2,2]
示例2
输入:"nowcoder"
返回值:[1,4,1,1,1]
示例3
输入:"aabbccdda"
返回值:[9]
备注:
1 <= s.length <= 5000
知识点
贪心
Java题解
import java.util.*;
public class Solution {
public int[] partitionLabels (String s) {
int[] lastOccurrence = new int[26];
for (int i = 0; i < s.length(); i++) {
lastOccurrence[s.charAt(i) - 'a'] = i;
}
List<Integer> result = new ArrayList<>();
int start = 0; // 当前分组的开始位置
int end = 0; // 当前分组的结束位置
for (int i = 0; i < s.length(); i++) {
end = Math.max(end, lastOccurrence[s.charAt(i) - 'a']);
if (i == end) {
result.add(end - start + 1);
start = end + 1;
}
}
int[] partitions = new int[result.size()];
for (int i = 0; i < partitions.length; i++) {
partitions[i] = result.get(i);
}
return partitions;
}
}
解题思路
这道题的意思是每一组出现的单词字符不能在其他组出现,并且还需要将字符串s划分成尽可能多的组,返回每组字符串长度的数组。 为了解决这个问题,我们可以使用贪心算法。首先,我们需要统计每个字母在字符串中最后一次出现的位置。然后,我们可以遍历字符串,维护一个当前分组的结束位置。当遍历到一个字符时,我们更新当前分组的结束位置为该字符的最后一次出现位置和当前分组的结束位置中的较大值。如果当前位置遍历到了当前分组的结束位置,说明当前分组已经遍历完毕,我们将当前分组的长度添加到结果列表中,并将当前位置作为下一个分组的开始位置。最后,返回结果列表。