簡體   English   中英

給定 2 個字符串,返回兩個字符串包含相同長度的位置數 2 substring

[英]Given 2 strings, return number of positions where the two strings contain the same length 2 substring

這是我的代碼:

def string_match(a, b):
  count = 0

  if len(a) < 2 or len(b) < 2:
    return 0

  for i in range(len(a)):
    if a[i:i+2] == b[i:i+2]:
      count = count + 1
  return count

結果如下:

在此處輸入圖像描述

如果我錯了請糾正我,但我發現它不起作用可能是因為兩個字符串長度相同。 如果我將 for 循環語句更改為:

for i in range(len(a)-1):

那么它將適用於所有提供的案例。 但是有人可以向我解釋為什么添加 -1 可以使它起作用嗎? 也許我正在理解 for 循環在這種情況下的工作方式。 誰能告訴我一種更優化的寫法,因為這可能是非常糟糕的代碼。 謝謝!

但是有人可以向我解釋為什么添加-1可以使它起作用嗎?

觀察:

test = 'food'
i = len(test) - 1
test[i:i+2] # produces 'd'

使用len(a)作為您的邊界意味着len(a) - 1將用作i值,因此在 a 的末尾獲取a切片,該切片將延伸到末尾。 在 Python 中,這樣的切片成功,但產生的字符較少。

字符串切片可以返回比請求的字符串更短的字符串。 在第一個檢查“abc”與“abc”的失敗示例中,在 for 循環的第三次迭代中, a[i:i+2]b[i:i+2]都等於“c”,並且因此計數增加。

使用range(len(a)-1)可確保您的循環在到達只有一個字母長的切片之前停止。

由於字符串的長度可能不同,因此您只想迭代到最短字符串的末尾。 此外,您正在訪問i+2 ,因此您只希望i迭代到最后一項之前的索引(否則您可能會在字符串末尾通過結束並獲得單 -字符串)。

def string_match(a: str, b: str) -> int:
    return len([
        a[i:i+2]
        for i in range(min(len(a), len(b)) - 1)
        if a[i:i+2] == b[i:i+2]
    ])

(您也可以使用sum進行此計數,但這也可以輕松獲得實際匹配項!)

你可以使用這個:

def string_match(a, b):
    if len(a) < 2 or len(b) < 0:
        return 0

    subs = [a[i:i+2] for i in range(len(a)-1)]
    occurence = list(map(lambda x: x in b, subs))

    return occurence.count(True)

暫無
暫無

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

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