Найти в Дзене
programmer's notes (python and more)

Программирование на языке Python. Поиск подстроки в строке. Еще алгоритмы

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Еще алгоритм поиска подстроки в строке

Еще один алгоритм поиска подстроки в строке. Он в принципе лежит на поверхности. Если до сих пор поиск осуществлялся последовательным движением по строке и сравнением, то возникает вопрос: а может мы в начале поищем подозрительные точки (индексы): т.е. получим список, где искать, а потом уже проверим, нет ли совпадений.

Можно искать просто по первому символу подстроки. Ниже представлена такая программа. Вхождение символа в строке s помещается в список ls. После этого уже проходим по индексам в ls и проверяем всю строку.

Рис. 1. Поиск подстроки в строке. Вариант 1. Текст программы см. ниже по ссылке
Рис. 1. Поиск подстроки в строке. Вариант 1. Текст программы см. ниже по ссылке
primer290.py

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

Рис. 2. Поиск подстроки в строке. Вариант 2. Текст программы см. ниже по ссылке
Рис. 2. Поиск подстроки в строке. Вариант 2. Текст программы см. ниже по ссылке
primer291.py

Ну и, наконец, для гурманов перепишем программу из рис. 2 следующим образом.

#!/usr/bin/python3
s = 'qwertyqwertyerwtywertyywertrrwerty'
sb = 'werty'
ll, n, m = len(sb), 0, 3
k = len(s) - ll + 1
print("Всего:", len([print(j) for j in [i for i in range(k) if s[i:i+m] == sb[0:m]] if sb[m:] == s[j+m:j+ll]]))


Красиво, да? Пишите однострочные алгоритмы, очень поднимает настроение.

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

Продолжение следует...

Ну, пока всё!

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

Ищите и дано будет вам
Ищите и дано будет вам