[编程题] 美团骑手包裹区间分组

225 阅读1分钟

题目来源

www.nowcoder.com/practice/80…

题目描述

2110年美团外卖火星第3000号配送站点有26名骑手,分别以大写字母A-Z命名,因此可以称呼这些骑手为黄家骑士特工A,黄家骑士特工B…黄家骑士特工Z,某美团黑珍珠餐厅的外卖流水线上会顺序产出一组包裹,美团配送调度引擎已经将包裹分配到骑手,并在包裹上粘贴好骑手名称,如RETTEBTAE代表一组流水线包裹共9个,同时分配给了名字为A B E R T的5名骑手。请在不打乱流水线产出顺序的情况下,把这组包裹划分为尽可能多的片段,同一个骑手只会出现在其中的一个片段,返回一个表示每个包裹片段的长度的列表。

做法

首先先用哈希表统计每一个字符最后出现的位置,然后以此作为分割点。

image.png

接着碰到G,由于G只有一个,所以可以单独作为一个分割点。

image.png

同理,D也是。

package main

import (
	"fmt"
)

func main() {
	var s string
	fmt.Scan(&s)

	//用哈希表记录每一个字符最后出现的位置.

	hash := make(map[byte]int)
	for i:=0;i<len(s);i++{
		hash[s[i]] = i
	}
	start, end := 0, 0
	ans := []string{}
	for i:=0;i<len(s);i++{
		//如果从前面到后面,碰到相等的字符,且是最后一个,那么作为一个字串.
		end = max(end, hash[s[i]])
		if i == end{
			//到达
			ans = append(ans, s[start:end])
			start = end + 1
		}
	}
	for i:=0;i<len(ans);i++{
		fmt.Printf("%d ", len(ans[i]) + 1)
	}
}

func max(x, y int) int{
	if x > y{
		return x
	}
	return y
}