вывести количество раз, когда подстрока встречается в данной строке слева направо в python - PullRequest
0 голосов
/ 13 февраля 2020

В этом вызове пользователь вводит строку и подстроку. Пользователь должен распечатать количество раз, когда подстрока встречается в данной строке. Обход строки будет происходить слева направо, а не справа налево.

Пример:

Input:  
WoW!ItSCoOWoWW
oW

Output:
2

Код:

def count_substring(string, sub_string):
    j=0
    flag=0
    counter=0
    for i in range(len(string)):
        if string[i] == sub_string[j]:
            if(j==0):
                flag=i
            j+=1
        else:
            j=0
            if(j==len(sub_string)-1):
                counter+=1
                i=flag+1
                j=0
    return counter

if __name__ == '__main__':
    string = input().strip()
    sub_string = input().strip()

    count = count_substring(string, sub_string)
    print(count)

Ошибка:

Traceback (последний вызов был последним): файл "C: / Users / shivangi / Documents / python codes / hackerrank solutions.py", строка 24, в файле count = count_substring (string, sub_string) «C: / Users / shivangi / Documents / python codes / hackerrank solutions.py», строка 7, в count_substring, если строка [i] == sub_string [j]: IndexError: строковый индекс вне диапазона

Я не понимаю, почему он показывает "строковый индекс вне диапазона" и как его можно решить

Ответы [ 5 ]

4 голосов
/ 13 февраля 2020

Вы можете просто сделать следующее:

input_str = 'WoW!ItSCoOWoWW'
pattern = 'oW'
print(input_str.count(pattern)) # will output 2

И вам не нужно такое сложное решение

Также как с использованием регулярных выражений:

import re
input_str = 'WoW!ItSCoOWoWW'
pattern = 'oW'
print(len(re.findall(pattern, input_str))) # also output 2

и просто для реализации l oop

idx = 0
pattern = 'oW'
input_str = 'WoW!ItSCoOWoWW'
pattern_len = len(pattern)
counter = 0

for ch in input_str:
    if ch == pattern[idx]:
        idx += 1
    else:
        idx = 0

    if pattern_len == idx:
        counter += 1
        idx = 0

print(counter) # 2
1 голос
/ 13 февраля 2020

Вы получаете индекс вне границ из-за j. Итак, допустим, что string равно WowWowWow, а sub_string равно ow. Поэтому, когда вы находитесь в 4. l oop, ваш i = 3, так что вы уже проверили Wow и нашли один экземпляр sub_string. Но в этом случае ваш j=2 увеличился на единицу, когда вы нашли первый o, а затем снова, когда вы нашли первый нижний регистр w. Но Ваш sub_string не имеет значения по индексу [2]. Таким образом, ваш sub_string[j] выходит за пределы. Я надеюсь, что все ясно.

Лучшим решением было бы использовать

counter = string.count(sub_string)
print(counter)

или

print(string.count(sub_string))
0 голосов
/ 06 марта 2020

При поиске подстрок, пожалуйста, убедитесь, что он считает перекрытия.

Например, строка: rabdadada подстрока: dada Count должно приходиться на две, а не на одну

def countSubstr(string, sub_string):
    count = start = 0
    while True:
        start = string.find(sub_string, start) + 1
        if start > 0:
            count+=1
        else:
            return count

if __name__ == '__main__':
    string = input().strip()
    sub_string = input().strip()

    count = countSubstr(string, sub_string)
    print(count)
0 голосов
/ 13 февраля 2020
def count_substring(string, sub_string):
  j=0
  counter=0
  for i in range(len(string)):
    if string[i] == sub_string[j]:
      j+=1
    else:
      j = 0
    if j == len(sub_string):
      j = 0
      counter += 1
  return counter

if __name__ == '__main__':
  string = input().strip()
  sub_string = input().strip()

  count = count_substring(string, sub_string)
  print(count)
0 голосов
/ 13 февраля 2020

Вы также можете разделить строку с помощью подстроки. Он вернет список с n + 1 элементами. Например, если подстрока встречается 2 раза, длина списка будет равна 3. Поэтому нам нужно уменьшить 1 из этого списка.

s = 'WoW!ItSCoOWoWW'
count = len(s.split('oW')) - 1 # output 2

проверено для этого примера, работает нормально. Не уверен, что это работает и для другого примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...