题目:
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
算法:
func partitionLabels(s string) []int {
charRegion := make([][]int, 26)
for i := range s {
if charRegion[int(s[i] - 'a')] == nil {
charRegion[int(s[i] - 'a')] = []int{i, i}
} else {
charRegion[int(s[i] - 'a')][1] = i
}
}
sort.Slice(charRegion, func(i, j int) bool {
if charRegion[i] == nil {
return false
}
if charRegion[j] == nil {
return true
}
return charRegion[i][0] < charRegion[j][0]
})
fmt.Println(charRegion)
ans := make([]int, 0)
start, end := charRegion[0][0], charRegion[0][1]
for i := 1; i < len(charRegion); i ++ {
if charRegion[i] == nil {
break
}
if charRegion[i][0] < end {
end = max(end, charRegion[i][1])
} else {
// fmt.Println(i,ans, start, end)
ans = append(ans, end - start + 1)
start = charRegion[i][0]
end = charRegion[i][1]
}
}
ans = append(ans, end - start + 1)
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}