例1:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
思路:
1.记录每个字母在S中最后出现的下标;
2.从下标0开始尝试分段,左边界left是0;
3.“同一个字母必须在同一片段中”,所以初始right是该段首字母最后出现的位置;
4.动态遍历left到right,如果有字符最后出现的下标大于right,更新right;
5.遍历完成,当前i==right时,一个分段就生成了。计数区间长度,更新left = right + 1,转3继续;
func partitionLabels(S string) []int {
strIndex := [26]int{}
//遍历并存储每一个字符最后出现的位置
for i := 0; i < len(S); i++ {
strIndex[S[i]-'a'] = i
}
//记录一个字段的初始和结束的位置
left, right := 0, 0
result := []int{}
//遍历字符串
for i, str := range S {
//如果当前字符串末尾位置大于end数值,则更新end数值
if strIndex[str-'a'] > right {
right = strIndex[str-'a']
}
//当出现当前i==end说明后面没有相似字符了,故记录进结果列表
if i == right {
result = append(result, right-left+1)
left = right + 1
}
}
return result
}