题目来源
题目描述
2110年美团外卖火星第3000号配送站点有26名骑手,分别以大写字母A-Z命名,因此可以称呼这些骑手为黄家骑士特工A,黄家骑士特工B…黄家骑士特工Z,某美团黑珍珠餐厅的外卖流水线上会顺序产出一组包裹,美团配送调度引擎已经将包裹分配到骑手,并在包裹上粘贴好骑手名称,如RETTEBTAE代表一组流水线包裹共9个,同时分配给了名字为A B E R T的5名骑手。请在不打乱流水线产出顺序的情况下,把这组包裹划分为尽可能多的片段,同一个骑手只会出现在其中的一个片段,返回一个表示每个包裹片段的长度的列表。
做法
首先先用哈希表统计每一个字符最后出现的位置,然后以此作为分割点。
接着碰到G,由于G只有一个,所以可以单独作为一个分割点。
同理,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
}