下面是我编写的代码,它计算长度为2的子字符串的数量,这些子字符串对于两个输入都是公共的字符串。还有子字符串应位于两个字符串中的同一位置。你知道吗
def string_match(a, b):
count=0
shorter=min(len(a),len(b))
for i in range(shorter):
if(a[i:i+2]==b[i:i+2]):
count=count+1
else:
continue
return count
对于长度不同的字符串,代码运行良好,但是对于长度相同的字符串,代码给出了错误的答案。例如:“abc”和“abc”应返回2,但返回3;“abc”和“axc”应返回0,但返回1。 上述问题可以通过将range(shorter)改为range(shorter-1)来解决,但我不明白为什么? 如果可能的话,建议我修改上面的代码,不管两个字符串中的位置如何,都可以计算相同的子字符串。你知道吗
提前谢谢!你知道吗
检查
for
循环^{} 默认从0到
n-1
。那么在n-1
的情况下会发生什么呢?您的循环正在尝试访问第n-1
个到第n+1
个字符。但是较小的字符串只有n
个字符。所以Python只返回那个字母而不是两个字母,所以两个长度相等的字符串,最后一个字符相同,就会给出一个假阳性。这就是为什么range(shorter - 1)
是必要的。你知道吗而且
continue
的使用是多余的,因为默认情况下循环将继续要在字符串中的任何位置找到长度为2的子字符串,这就足够了
创建一个列表
string1subs
,其中包含string1
中长度为2的所有子字符串。然后循环遍历string2
中长度为2的所有子串,并检查它是否是string1
的子串。如果您喜欢更简洁的版本:使用^{} 的完全相同的版本,并且在Python中,
True
等于1。你知道吗最好的方法是根本不使用任何索引访问:
或使用生成器表达式:
一些好的旧打印调试应该让事情更清楚:
以及输出:
看到问题了吗?你总是在最后比较长度为1的子串。这是因为
'abc'[2:4]
只会给你'c'
。你知道吗因此,您需要提前一步结束(或者更一般地说,在比较长度为
n
的子字符串时,提前n-1
步)。这正是您的-1
更改所能做的,这就是它有帮助的原因。你知道吗随着
-1
的变化:以及新的输出:
相关问题 更多 >
编程相关推荐