[英]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.