用一个唯一元素计算长度为 3+ 的二进制子串的数量

Posted

技术标签:

【中文标题】用一个唯一元素计算长度为 3+ 的二进制子串的数量【英文标题】:Counting number of binary substrings of length 3+ with one unique element 【发布时间】:2022-01-21 16:46:05 【问题描述】:

基本上,我得到了两行输入。第一行是第二行输入中呈现的子串的整数长度,仅由 Gs 和 Hs 组成,类似于 0s 和 1s。

N = int(input())
chars = list(input())
lonely = 0
for i in range(3, N + 1):
  for j in range(N - i + 1):
      if ((chars[j:j + i].count('G') == 1) or (chars[j:j + i].count('H') == 1)):
          lonely += 1
print(lonely)

一个示例输入是:

5
GHGHG

答案是3:答案是原始字符串的长度为3或更大且只有一个G或一个H的子串的数量(这个G或H是'孤独的'),对于上述样例中,满足该条件的子串为chars[0:3]chars[1:4]chars[2:5]。虽然我认为这在技术上是正确的,但对 N 没有任何限制,因此我对 N = 5000 等的测试用例超时(每个测试用例的时间限制为 4 秒)。

我该如何解决这个问题?

谢谢!

【问题讨论】:

这能回答你的问题吗? Effeciently remove single letter substrings from a string 顺便说一句,这是从哪里来的? 【参考方案1】:

您可以在“G”上拆分字符串,并分析拆分两侧 H 的左右条纹的大小。这将让您使用计算其中包含孤独 G 的子字符串的数量。给定 G 拆分的子串数将由 3 部分组成:左侧的 n 个 H 将形成以 G 结尾的 n-1 个子串。右侧的 m 个 H 将形成以 G 开头的 m-1 个子串. 左右的乘积(nxm)将与Hs之间的G形成子串。

def count3(chars):
    count = 0
    for lonely in "GH":                 # count for G, then H
        streaks = map(len,chars.split(lonely)) 
        left    = next(streaks)         # first left side
        for right in streaks:           # get right sides
            count += max(0,left-1)      # HH...G
            count += max(0,right-1)     # G...HH
            count += left*right         # H...G...H                
            left = right                # track new left side
    return count

输出:

for testCase in ("G","GH","GHH","HG","HGH","HGHH","HHG","HHGH","HHGHH",
          "GG","HHHGHHH","GGHGG","GGH"):
    print(testCase,count3(testCase))

G 0
GH 0
GHH 1
HG 0
HGH 1
HGHH 3
HHG 1
HHGH 3
HHGHH 6
GG 0
HHHGHHH 13
GGHGG 6
GGH 1

【讨论】:

我改变了解决方案,最初误解了这个问题,让它只计算长度为 3 的子字符串(也有一个错误)。我现在计算所有长度的子串 >= 3 是的,现在看起来不错,并且在我测试的所有字符串上给出了与 OP 相同的结果(所有可能的字符串最多 16 个字符,以及一些 1000 个字符的随机字符串)。 if left+right>1: 不是必需的,只是优化,对吧? 对,if left+right>1: 不是必须的(它是之前逻辑的残余)

以上是关于用一个唯一元素计算长度为 3+ 的二进制子串的数量的主要内容,如果未能解决你的问题,请参考以下文章

[面试题]找出字符串在集合中的子串数量(字符串)

[面试题]找出字符串在集合中的子串数量(字符串)

华为笔试算法题1

用JAVA编写一个程序实现,计算两个字符串最长相同子串的长度。

用JAVA编写一个程序实现,计算两个字符串最长相同子串的长度。

力扣:串联所有单词的子串(滑动窗口+哈希)