go语言刷题:763. 划分字母区间

763. 划分字母区间

例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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值