查看: 2228|回复: 5
收起左侧

Google : 找最小窗口

|只看干货 |刷题
头像被屏蔽

分享帖子到朋友圈
wwwyhx | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:Google : 位逆序
下一篇:google : Organize football tournament
darksteel 2011-5-23 03:37:13 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
本帖最后由 darksteel 于 2011-5-23 03:41 编辑

回复 1# wwwyhx
小声说一句,这题你前面发过了

这题应该能做到O(kn)。假设数组是a[1..n]和q[1..k]。
dp[n][k]: dp[ i][j]表示从a[ i]开始,包含q[j...k]的最小窗口的长度。初只全部设为INF。
for i = 1 to n
  if a[ i] == q[k]
    dp[ i][k] = 1;
for i = k-1 to 1
  p = -1;
  for j = n to 1
    if a[j] == q && p > 0
      dp[j][ i] = dp[p][i+1] + p - j;
    if a[j] == q[i+1]  p = j;
最后答案是dp[ i][1]之中最小的那个。
以上伪代码可能有漏洞,但大体思路是这样。假设某个位置a[ i]的值等于q[1],要找严格从这个位置开始的最小窗口,我们总是可以用贪心的策略,找到第一个q[2]就继续找q3],然后找到第一个q[3]就开始找 q[4],跳过某个不会使解更优。所以每次内层循环我们只要维护一个离当前最近的q[i+1]的位置,直到找到一个q[ i],然后可以直接通过dp[p][i+1]得出dp[j][ i]。细节还有可以简化的地方,空间好像也能优化到O(n)。欢迎指出漏洞。
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-5-25 21:48:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

darksteel 2011-5-28 14:17:25 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
回复 3# wwwyhx
这个就是最朴素的办法吧,就是从每个位置都向后找一遍,这样最坏可能是n^2,虽然中间可以略过一些,但应该不会有本质的提高。我觉得是可以做到kn的
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-5-28 14:28:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-5-28 14:35:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■拉群请前往同学同事飞友|拉群结伴版块,其他版块拉群,帖子会被自动删除
■论坛不能删帖,为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://tools.1point3acres.com/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

>
快速回复 返回顶部 返回列表