楼主: 北极兔兔鲨
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 求助一道shortest balanced substring的题!

🔗
sylvia2010 2021-1-7 10:18:21 | 只看该作者
全局:
Jay16 发表于 2021-1-7 09:47
非常感谢这么详细的解答。感激!

while i <= lastseen[c] 其实是错的,我刚刚自己构造了一个反例 "acdCAcD". 更新一下,末尾给了几个 test case.

  1. def shortestBalanecdSubstring(s):
  2.     count = collections.Counter()
  3.     lastseen = collections.defaultdict(lambda :-1)
  4.     i = 0
  5.     ans = math.inf
  6.     res = ''
  7.     for j, c in enumerate(s):
  8.         count[c] += 1
  9.         C = c.swapcase()
  10.         if count[C] == 0 or lastseen[C] < lastseen[c]:
  11.             lastseen[c] = j
  12.             continue
  13.         while i < lastseen[s[i]] or i <= j - ans + 1:
  14.             count[s[i]] -= 1
  15.             i += 1
  16.         count2 = +count
  17.         for k in range(i, lastseen[C]+1):
  18.             if all(count2[c.swapcase()] for c in count2 if count2[c]):
  19.                 res = s[k:j+1]
  20.                 ans = j-k+1
  21.             count2[s[k]] -= 1
  22.         lastseen[c] = j
  23.     return res

  24. shortestBalanecdSubstring("ABaBcabC")
  25. shortestBalanecdSubstring("acdCAcD")
  26. s = "".join([random.choice(string.ascii_letters) for _ in range(20000)])
  27. shortestBalanecdSubstring(s)
复制代码

评分

参与人数 3大米 +5 收起 理由
guaneyu + 1 欢迎分享你知道的情况,会给更多积分奖励!
北极兔兔鲨 + 1 给你点个赞!
Jay16 + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
ytx2013 2021-1-7 14:19:08 | 只看该作者
全局:
感觉可以参考下 刷题网 395.
比较快的一个解题思路就是  利用一个隐含条件:只有26中字母, 然后结合双指针大法之追赶法。
时间复杂度 O(26*N)

评分

参与人数 2大米 +3 收起 理由
heiyu + 2 给你点个赞!
北极兔兔鲨 + 1 哈哈什么双指针大法哈哈哈

查看全部评分

回复

使用道具 举报

🔗
sylvia2010 2021-1-7 15:09:34 | 只看该作者
全局:
ytx2013 发表于 2021-1-7 14:19
感觉可以参考下 刷题网 395.
比较快的一个解题思路就是  利用一个隐含条件:只有26中字母, 然后结合双指 ...

比你想的复杂,Substring 如果不到 K Repeating Characters 你把窗口缩短以后更不会到。但如果 substring is not balanced, 缩短以后有可能变成 balanced 的,所以比一般的 sliding window 恶心点。
回复

使用道具 举报

🔗
ytx2013 2021-1-7 15:34:51 | 只看该作者
全局:
sylvia2010 发表于 2021-1-7 15:09
比你想的复杂,Substring 如果不到 K Repeating Characters 你把窗口缩短以后更不会到。但如果 substring ...

要不给几个反例试试看?

btw, 我说的是参考这个思路
https://leetcode.com/problems/lo ... 87739/Java-Strict-O(N)-Two-Pointer-Solution

回复

使用道具 举报

🔗
sylvia2010 2021-1-7 15:56:45 | 只看该作者
全局:
ytx2013 发表于 2021-1-7 15:34
要不给几个反例试试看?

btw, 我说的是参考这个思路

你不写出来我怎么给反例啊,你先试试 aBBBBBBBBBBBBBB...AAAAAAAAAAAAAAAAAAb 这种。
回复

使用道具 举报

全局:
可以用类似于prefix sum的思路做。
prefixSum[i][char] 表示字符串前i个字符里面,大写的char的比小写的char多出现多少次(可以是负数)。其中0&lt;=i&lt;=n,’a’&lt;=char&lt;=‘z’。

再用一个map来存key: prefixSum[i] -&gt; value: i (注:这里的prefixSum[i]是一个长度为26的数组,Java里我们可以用ArrayList)

i 从0开始一直到n,当往map里放key: prefixSum[i] -&gt; value: i,如果发现map已经存在和prefixSum[i]相等key,那就用i减去已有的key对应的value,如果差值小于当前ans,就update当前answer。

评分

参与人数 1大米 +1 收起 理由
北极兔兔鲨 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| 北极兔兔鲨 2021-1-7 17:31:03 | 只看该作者
全局:
ytx2013 发表于 2021-1-7 14:19
感觉可以参考下 刷题网 395.
比较快的一个解题思路就是  利用一个隐含条件:只有26 ...
哈哈什么双指针大法哈哈哈
回复

使用道具 举报

🔗
 楼主| 北极兔兔鲨 2021-1-7 17:32:10 | 只看该作者
全局:
readman 发表于 2021-1-6 00:03
shortest?? 真的吗? 空string难道不是满足题意的答案么?
这个疑问确实我的题里没说清楚
回复

使用道具 举报

🔗
 楼主| 北极兔兔鲨 2021-1-7 17:37:56 | 只看该作者
全局:
ytx2013 发表于 2021-1-7 14:19
感觉可以参考下 刷题网 395.
比较快的一个解题思路就是  利用一个隐含条件:只有26中字母, 然后结合双指 ...

确实leetcode讨论区也给出一个26n的解法,这种应该才是最优的,谢谢题号,我去做一下启发下思路
回复

使用道具 举报

🔗
 楼主| 北极兔兔鲨 2021-1-7 17:49:08 | 只看该作者
全局:
ytx2013 发表于 2021-1-7 14:19
感觉可以参考下 刷题网 395.
比较快的一个解题思路就是  利用一个隐含条件:只有26中字母, 然后结合双指 ...

你说的隐含条件 - 只有26中字母,这个特别对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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