楼主: 陈家洛
跳转到指定楼层
上一主题 下一主题
收起左侧

[字符串] 白嫖oa一道题求解

🔗
 楼主| 陈家洛 2020-9-2 06:52:57 | 只看该作者
全局:
北十字星 发表于 2020-9-2 06:03
纯问。。我也不是很确定哈。。刚开始刷题。。。能不能用一个dict()存储每个char出现的频率然后再走一遍dict ...

不太理解同学说的走第二遍dict的过程,可以具体说一下吗?
回复

使用道具 举报

🔗
韦小崽 2020-9-2 08:01:26 | 只看该作者
全局:
ND0406 发表于 2020-9-2 06:52
如果k是1, 这个方法是n平方吧?

还是n...确切的来说是2n
回复

使用道具 举报

🔗
Actuant 2020-9-2 08:02:18 | 只看该作者
全局:
本帖最后由 Actuant 于 2020-9-2 08:05 编辑

写了个O(n) / O(n)的,有的地方能优化,不过不影响复杂度就没再改了


  1. class Solution:
  2.     def get_comp_len(self, s, k):

  3.         ans = n = len(s)

  4.         def get_comp_arr(s):
  5.             i, j, ch, pre = -1, 0, s[0], (-1, 0)
  6.             arr = [0] * n
  7.             while i < n and j < n:
  8.                 while j < n and s[j] == ch:
  9.                     arr[j] = pre
  10.                     j += 1
  11.                 pre = (j - 1, pre[1] + len(str(j - i - 1)) + (j - 2 > i))
  12.                 i = j - 1
  13.                 if j >= n:
  14.                     break
  15.                 ch = s[j]
  16.             return arr

  17.         l_comp = get_comp_arr(s)
  18.         r_comp = [(n - i - 1, l) for i, l in get_comp_arr(s[::-1])][::-1]

  19.         for r in range(k - 1, n):
  20.             l = r - k + 1
  21.             l_idx, l_len = l_comp[l - 1] if l > 0 else (-1, 0)
  22.             r_idx, r_len = r_comp[r + 1] if r < n - 1 else (n, 0)
  23.             if l == 0 or r == n - 1 or s[l - 1] != s[r + 1]:
  24.                 ans = min(ans, l_len + r_len + (l - l_idx - 1) + (r_idx - r - 1))
  25.             else:
  26.                 ans = min(ans, l_len + r_len + len(str(r_idx - l_idx - r + l - 2)) + 1)
  27.         return ans

复制代码



试了下面几个test cases,不知道有没有edge case没考虑到

  1. if __name__ == '__main__':
  2.     s = Solution()
  3.     print(s.get_comp_len('ABBBCCDDCCC', 3))
  4.     print(s.get_comp_len('AABBCBBAA', 1))
  5.     print(s.get_comp_len('A'*50 + 'B' + 'A'*50, 1))
复制代码





回复

使用道具 举报

🔗
韦小崽 2020-9-2 08:03:31 | 只看该作者
全局:
ND0406 发表于 2020-9-2 06:52
如果k是1, 这个方法是n平方吧?

还是n...确切的来说是2n
回复

使用道具 举报

🔗
Actuant 2020-9-2 08:04:25 | 只看该作者
全局:
advpetc 发表于 2020-9-2 06:48
看了一下1531,貌似还是有点区别?这道题要求连续的k个字母,1531貌似没这个要求。比如: aaabcccd,k=2那 ...

ahh刚看到要求连续,写了一份新的另外回复了
回复

使用道具 举报

🔗
北十字星 2020-9-2 10:05:34 | 只看该作者
全局:
advpetc 发表于 2020-9-2 06:52
不太理解同学说的走第二遍dict的过程,可以具体说一下吗?

就是如果我们有AABBCD, dict里面会存{A:2,B:2,C:1,D:1}, 然后如果大于1的话count+1+对应的数字的位数(写个helper用mod10),等于1就count+1就行了
回复

使用道具 举报

🔗
 楼主| 陈家洛 2020-9-2 10:50:26 | 只看该作者
全局:
北十字星 发表于 2020-9-2 10:05
就是如果我们有AABBCD, dict里面会存{A:2,B:2,C:1,D:1}, 然后如果大于1的话count+1+对应的数字的位数(写 ...

嗯嗯,compress的步骤应该可以这样
回复

使用道具 举报

🔗
ND0406 2020-9-2 11:04:38 | 只看该作者
全局:
可惜了。。。 python代码我看不懂呀。。。。
有JAVA大神可以说一下具体思路吗?
回复

使用道具 举报

🔗
韦小崽 2020-9-2 23:02:43 | 只看该作者
全局:
本帖最后由 韦小崽 于 2020-9-2 23:07 编辑
北十字星 发表于 2020-9-2 10:05
就是如果我们有AABBCD, dict里面会存{A:2,B:2,C:1,D:1}, 然后如果大于1的话count+1+对应的数字的位数(写 ...

用dict会出现一个问题就是

aaabcdefgaaaaaa, k < 6。比如等于5把,那这题最优解就应该是a3ba6或者a3ga6

你要是用dict的话你a怎么存,3还是6还是9?(你不可能存两次)
回复

使用道具 举报

🔗
北十字星 2020-9-2 23:56:56 | 只看该作者
全局:
韦小崽 发表于 2020-9-2 23:02
用dict会出现一个问题就是

aaabcdefgaaaaaa, k < 6。比如等于5把,那这题最优解就应该是a3ba6或者a3ga ...

哦哦我直接点到lz给的leetcode页面去看了……那个题和这个题条件不一样,你说得对。
回复

使用道具 举报

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

本版积分规则

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