Код, который может найти строку в тексте рекурсивно - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть код, который удовлетворяет вопросу выше. Тем не менее, мне лично любопытно, как его перекодировать так, чтобы, если текст не имел пробела и был задан как "LoveIsWar", код все равно возвращал бы true, если строка "War".

. Я думал о проверке букв за буквой, но не уверен, как это сделать. Был бы очень признателен, если бы я мог получить руководство по этому вопросу!

def find(text, substring):
    if(len(text) <= 0):
        return None
    elif(text[0] == substring):
        return substring
    else:
        return find(text[1:], substring)


def is_string_there(text, string):
    if find(text.split(), string):
        return True
    else: return False

print(is_string_there("love is war","war"))
print(is_string_there("love is war","warfalse"))

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

def find(text, substring):
    if(len(text) <= 0):
        return None
    elif(text[0:len(substring)] == substring):
        return substring
    else:
        return find(text[1:], substring)


def is_string_there(text, string):
    if find(text.lower(), string.lower()):
        return True
    else: return False

print(is_string_there("love is war","war"))
print(is_string_there("love is war","warfalse"))

Ответы [ 4 ]

0 голосов
/ 04 февраля 2020

Отличный вопрос. Учитывая ограничение рекурсивной функции , с точки зрения непрофессионала, вы хотите достичь скользящего окна поиска по строке.

То есть, когда вы передаете ' text 'в функцию find, вы не передаете его как массив, вы пропускаете сам текст.

Функция' find 'затем выполняет итерацию не по элементам массива, а через буквы в строке, отбрасывая их одну за другой. Следовательно, ваше «окно» - или ваш взгляд на строку скользит по ней, пока вы не закончите sh.

Все, что вам действительно нужно изменить:

text[0] == substring

Следует проверить, соответствует ли text[0:length_of_substring] подстроке. Помните, что у нас есть те же самые операции со строками, что и с массивами!

Если этого не происходит, переместите 1 символ вперед (так же, как вы делаете при поиске по массиву).

Для вашего интереса, эти виды проблем могут быть решены очень эффективно с помощью таких алгоритмов, как Рабин Карп

Небольшая оптимизация, которую вы можете сделать, это , исключая из вашего поиска, когда в вашем тексте осталось меньше символов, чем в подстроке.

Надеюсь, это поможет!

0 голосов
/ 04 февраля 2020

Вы можете напрямую использовать in, чтобы выяснить, присутствует ли подстрока в данной строке или нет.

Примерно так:

myString1 = "Love Is War"
myString2 = "LoveIsWar"

print("War" in myString1)

print("War" in myString2)

0 голосов
/ 04 февраля 2020

вы знаете, что вы можете проверить наличие подстрок в python, используя оператор in?

if "war".lower() in "LoveIsWar".lower():
    return True

lower используется для сопоставления без учета регистра

, если вам это нужно для быть рекурсивной функцией, я предлагаю взглянуть на это: https://www.geeksforgeeks.org/recursive-function-to-do-substring-search/

0 голосов
/ 04 февраля 2020

Я не уверен, что что-то упустил, но почему вы не используете ключевое слово in? 1002 *

>>>"War" in "Love is War"
true
>>>"War" in "LoveIsWar"
true
>>>"Warfalse" in "Love is War"
false
...