763.划分字母区间

80 阅读1分钟

题目:
字符串 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
}