Текущий лучший ответ, включающий метод count
, на самом деле не учитывается для перекрывающихся вхождений и не заботится о пустых подстроках.Например:
>>> a = 'caatatab'
>>> b = 'ata'
>>> print(a.count(b)) #overlapping
1
>>>print(a.count('')) #empty string
9
Первый ответ должен быть 2
, а не 1
, если мы рассмотрим перекрывающиеся подстроки.Что касается второго ответа, то лучше, если пустая подстрока возвращает 0 как asnwer.
Следующий код заботится об этих вещах.
def num_of_patterns(astr,pattern):
astr, pattern = astr.strip(), pattern.strip()
if pattern == '': return 0
ind, count, start_flag = 0,0,0
while True:
try:
if start_flag == 0:
ind = astr.index(pattern)
start_flag = 1
else:
ind += 1 + astr[ind+1:].index(pattern)
count += 1
except:
break
return count
Теперь, когда мы его запустим:
>>>num_of_patterns('caatatab', 'ata') #overlapping
2
>>>num_of_patterns('caatatab', '') #empty string
0
>>>num_of_patterns('abcdabcva','ab') #normal
2