我必须在不使用库函数的情况下进行此练习。到目前为止,我到达了这里: -
string = input("Enther The String :")
substring = input("Enter the substring :")
count = 0
for i in range(len(string)):
if string[i:i+len(substring)] == substring:
if string[i+len(substring)] == ' ':
count += 1
else:
count = 0
print(count)
但是,让我们说如果子串是'bob'并且字符串是'bob cat bob cat bobs cat',程序仍然会在'bobs'中计算'bob'而我不希望这样。此代码也始终返回0.请帮忙!谢谢!
答案 0 :(得分:2)
程序仍然在'bobs'中计算'bob'
没有。
此代码也始终返回0
这是因为你的else子句。
else:
count = 0
你在这里重置计数。那不是你想要的;如果下一个字符不是空格,你根本不想做任何事情。删除整个else子句。
您还有一个未注意到的其他错误。如果string
以substring
结尾,则进行以下测试:
if string[i+len(substring)] == ' ':
将尝试读取字符串的结尾并抛出IndexError
。首先尝试解决这个问题。
答案 1 :(得分:0)
由于你被允许使用切片,所以你可以用它来检查子串之前/之后的字符是空格还是空字符串,如果是则递增计数为1.注意切片永远不会引发异常,即使是超出范围的指数。
def sub_str_count(s, sub_str):
le = len(sub_str)
count = 0
for i in range(len(s)):
if s[i:i+le] == sub_str and s[i-1:i] in ('', ' ') and \
s[i+le:i+le+1] in ('', ' '):
count += 1
return count
基于异常处理的上述代码版本:
def check(s, ind):
"""
Check whether the item present at this index is a space or not.
For out of bound indices return True.
For negative indices return True.
"""
if ind < 0:
return True
try:
return s[ind] == ' '
except IndexError:
return True
def sub_str_count(s, sub_str):
le = len(sub_str)
count = 0
for i in range(len(s)):
if s[i:i+le] == sub_str and check(s, i-1) and check(s, i+le):
count += 1
return count