簡體   English   中英

用一個唯一元素計算長度為 3+ 的二進制子串的數量

[英]Counting number of binary substrings of length 3+ with one unique element

本質上,我得到了兩行輸入。 第一行是輸入第二行中呈現的 substring 的 integer 長度,僅由 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 秒)。

我該如何解決這個問題?

謝謝!

這應該更快:

chars = "GHGHG"

count = 0
for letter in "GH":                        # count for G, then H
    prev = 0                               # length of previous non-letter
    for s in map(len,chars.split(letter)): # get in-betweens
        s = min(2,s)                       # look at no more than 2 each side 
        count += max(0,s+prev-1)           # before+after >= 2
        prev = s
        
print(count) # 3

如果您在字母“G”上拆分字符串,您將在各個 G 之間獲得 H。 如果 G 每一側的 H 總數 >= 2,那么您有一個 substring,其中有一個 G。 您只需要查看前后最多 2 個 H。

前后計數限制為 2,只有 9 種可能性:

  • "G" -> 0 之前,0 之后 --> 沒有 substring
  • "GH" -> 0 之前,1 之后 --> 沒有 substring
  • "GHH" -> 0 之前,2 之后 --> 1 substring
  • "HG" -> 1 之前,0 之后 --> 沒有 substring
  • “HGH”-> 1 之前,1 之后 --> 1 substring
  • "HGHH" -> 1 個之前,2 個之后 --> 2 個子字符串(HGH 和 GHH)
  • “HHG” -> 2 之前,0 之后 --> 1 substring
  • "HHGH" -> 2 個之前,1 個之后 --> 2 個子字符串(HHG 和 HGH)
  • "HHGHH" -> 2 個之前,2 個之后 --> 3 個子字符串(HHG、HGH、GHH)

您可以以相同的方式獲得孤獨的“H”計數(即在 H 上拆分)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM