Можно просто как-то так, к примеру: def find_bmh_my(text, pattern): if (len_pattern := len(pattern)) > (len_text := len(text)): return -1 shifts = {} for i, v in enumerate(pattern): if v not in shifts: shifts[v] = i + 1 shift = (len_pattern_minus_one := len_pattern - 1) while shift < len_text: p, t = len_pattern_minus_one, shift while p >= 0 and text[t] == pattern[p]: p, t = p-1, t-1 if p == -1: return t + 1 shift += shifts.get(text[shift], len_pattern) return -1
Спасибо за Ваши уроки! Но, либо я что-то не могу понять, либо здесь неточность. На 6:20 Вы говорите, что при несовпадении не последних символов в образе и строке, смещение выбирается по не совпавшему символу образа. Мне кажется более правильно будет так. В этом случае смещение выбирается по символу СТРОКИ, соответствующему последнему символу образа.
Здравствуйте. Почему в программе, при формировании таблицы смещений, когда формируем последний символ, не учитывается то, что этот последний символ может совпадать с другим символом из образа? Как в образе "зорро", например.
Знаю поздно, но отвечу. В программе это учитывается, ведь если мы встретили последний символ в образе мы его добавили,а если мы его добавили, условие не выполнится и мы не будем добавлять этот символ с длинной строки, а оставим как до этого добавили.
Цикл по подстроке с enumerate ``` for i, char in enumerate(sub[-2::-1], start=1): if not char in sub_unique: sub_shift[char] = i sub_unique.add(char) ```
ну можешь переверунть строку и образ сразу после их объявления) а результат (если образ есть в строке) переобъяви >>> результат = длинна строки - 1 - результат
Обновил программу, возможно это было из-за отсутствия переменной j в области видимости цикла while. Если будут проблемы, укажите строку и образ, для которых запускаете алгоритм.
Если несовпадающий символ не самый правый/последний в образе то смещение берем по: 1. У вас: по несовпадающему символу образа 2. Вот тут: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-KIUHWMwavQg.html по последнему символу образа 3. А вот тут ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-N6G6HVwJ4wQ.html : по несовпадающему символу СТРОКИ Почему такие разночтения ?
Потому что автор основную идею алгоритма не объяснил. Суть идеи в том, что у нас есть "стоп-символ". Это тот символ, который стоит в тексте под последним символом шаблона. В этом случае: больше метеоданные данные стоп-символ буква "и". А в этом случае: большие метеданные данные уже буква "о". То есть после каждого смещения шаблона стоп-символ меняется. И основная идея алгоритма в том, чтобы в случае, если у нас происходит несоответствие символов в месте, то нам нужно подогнать под стоп-символ последнее вхождение стоп-символа в шаблоне если он есть в шаблоне, если его нет то просто сместить шаблон на всю его длину. Но может возникнуть тогда проблема, что если у нас стоп-символ есть в шаблоне и он находится именно в последней позиции шаблона в единственном экземпляре, то тогда возникнет вечный цикл. Это соответствует следующей ситуации: больше метеоданные данные В этом случае мы просто двигаем шаблон на всю его длину. Вот и вся идея, которую можно реализовать по-разному, поэтому у авторов, которые рассказывают конкретные реализации, но при этом не рассказывают саму идею алгоритма и возникают такие вопросы
a = input('Пишите строка: ') b = input('Пишите элемент которые вы хотите найти индекс: ') if len(b) > len(a): print('Такой элемент нет в строке!!!') else: x = [] for i in range(len(a)): if a[i:len(b)+i] == b: x.append(i) if len(x) == 0: print('Такой элемент нет в строке!!!') else: print('В строке есть ', len(x), ' элемент. Индекс: ', x) Я разработал собственный алгоритм может этот алгоритм раньше была. Но я разработал его собственный головой. Этот алгоритм найдёт все элементы которые надо найти в строке. Пожалуйста памагите проверить правильность этого алгоритма
@@user-nc8iu3lc8e Если первый индекс вхождения - 5, то ты уже проверил первые 5 элементов на вхождение подстроки. Теперь осталось проверить оставшуюся строку на вхождение. Т.е. строку начиная с индекса 5+1 до n.
Да, была ошибочка в программе (если несовпадение для первого символа, то j=0 и делался вывод, что образ найден). Поправил, выложил на github измененный вариант. Скачивайте и наслаждайтесь! )) Спасибо!