2014-01-28 2 views
1

Я должен выполнить это упражнение, не используя библиотечную функцию. До сих пор я достиг здесь: -Поиск числа вхождений подстроки в строке без использования библиотечных функций

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) 

Но, скажем, если подстрока является «боб» и строка «боб кот боб кот качается кошка», программа по-прежнему считает «боб» в «Бобс», и я не хочу этого. Также этот код всегда возвращает 0. Пожалуйста, помогите! Благодаря!

+0

Вы можете использовать 'сплит()'? –

+0

Нет, мы не можем его использовать. –

+0

Каким должен быть счет для чего-то вроде «bobob''? –

ответ

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 
+0

Не знаком с 'try.' –

+0

@VedantGanjoo Используется для обработки исключений (http://docs.python.org/2/tutorial/errors.html). –

+0

Можем ли мы сделать это без этого? –

2

программа по-прежнему считает 'боб' в 'качается'

нет.

Кроме того, этот код всегда возвращает 0

Это из-за вашего еще статьи.

 else: 
      count = 0 

Вы сбрасываете счет здесь. Это не то, что вы хотите; если следующий символ не является пространством, вы не хотите ничего делать. Удалите все предложение else.

У вас есть дополнительная ошибка, которую вы не заметили. Если string заканчивается substring, следующий тест:

 if string[i+len(substring)] == ' ': 

будет пытаться читать мимо конца строки и бросить IndexError. Попытайтесь решить эту проблему самостоятельно.

+0

Я был на этом в течение 2 часов. Я не могу понять это. –

+0

Нет, я не в состоянии это сделать. –

+0

Попробуйте изменить термин 'range' вашего цикла' for' – Frodon

Смежные вопросы