Java

Owll 发表于 1年前 · 关联问题 Browser Games

题目:Browser Games

题目大意:游戏公司要发布n个游戏,一天发布一个,每个游戏由一个字符串构成,由于游戏公司的一些不当操作。游戏可以通过游戏名前缀进行访问,导致可以利用bug把没发布的游戏全部偷出来,现在老板让你在规划每一天所需要的前缀的最小值,且前i天的前缀不能访问到没发布的游戏。

用户访问过程如下:用户发送请求url->后台根据当天的前缀数组去判断请求的url是否是已发布的游戏->如果请求的url不匹配任意一个前缀则直接拒绝请求

以样例为例:

  • 3
  • ufoipv.ofu
  • hsbocmvfgboubtz.kq
  • hfotijo.njipzp.dpn/kb

第一天的前缀数组为['u'],第二天的为['u','hs'](如果是['u','h']那么第三天发布的游戏url也符合匹配,不能过滤掉),第三天的为['u','h']

因此题目要求的是当天发布完游戏后,可以最少使用多少前缀去过滤用户的请求

思路:

  1. 用所有字符串建立一棵字典树
  2. 从后往前遍历原始字符串数组,并将其从字典树中删除,在删除的过程中统计答案。从左到右遍历字符串删除,对于同一父节点的子节点,非当前字符的其他字符如果不为空,则答案加一

比如:有三个字符串

  • adc
  • bca
  • abd

删除最后一个字符串。从左到右遍历,i=0,同一层还有'b',答案加一;i=1,同一层还有'd',答案加一;i=2,同一层没有其他字符,答案不变。因此倒数第二天的最小前缀数组长度为2,['b','ad']