繁体   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