用一个唯一元素计算长度为 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+ 的二进制子串的数量的主要内容,如果未能解决你的问题,请参考以下文章
用JAVA编写一个程序实现,计算两个字符串最长相同子串的长度。