Лексикографическое сравнение строк
Лексикографическое сравнение строк — это сравнение слов так, как они располагаются в словаре: сначала сравниваются первые символы, затем вторые и так далее. Тема нужна для определения порядка слов, поиска минимальной или максимальной строки и решения задач, где строки требуется отсортировать.
Что такое лексикографический порядок
Перед изучением темы полезно повторить, что строка состоит из символов, а каждый символ имеет индекс. В большинстве учебных задач нумерация индексов начинается с нуля: первый символ имеет индекс 0. Подробнее о строении строки рассказано на страницах символ строки и индекс символа.
Лексикографический порядок — порядок строк, при котором строки сравниваются слева направо по первым различающимся символам. Название связано с порядком слов в словаре.
Пусть есть две строки \(A\) и \(B\). Алгоритм сравнения таков: сначала сравниваются \(A[0]\) и \(B[0]\). Если они различаются, результат определяется только ими. Если равны, сравниваются символы с индексом 1, затем 2 и так далее. Сравнение заканчивается при первом различии или после окончания одной из строк.
Результат сравнения двух строк определяется первым индексом \(i\), на котором символы различаются. Если \(A[i] < B[i]\), то \(A < B\); если \(A[i] > B[i]\), то \(A > B\).
Например, строка «кот» меньше строки «кит», потому что первые символы равны, а на индексе 1 сравниваются «о» и «и». В русском алфавите «и» расположена раньше «о», поэтому «кит» меньше «кот».
Сравнение символов и строк разной длины
Чтобы сравнивать символы, нужно знать их порядок. В задачах с русскими или английскими буквами обычно используется порядок алфавита. Для цифр порядок естественный: «0» меньше «1», «1» меньше «2» и так далее. В программировании фактический порядок определяется кодами символов, поэтому прописные и строчные буквы могут располагаться не так, как ожидается по словарю.
Строки «Дом» и «дом» могут сравниваться не как одинаковые слова: прописная и строчная буквы — разные символы. Если в условии не сказано игнорировать регистр, учитывайте его.
Особый случай возникает, когда все символы короткой строки совпали с началом длинной. Тогда короткая строка считается меньшей. Например, «кот» меньше «коты», потому что после совпадения «к», «о», «т» первая строка закончилась.
| Сравнение | Первое различие или причина | Результат |
|---|---|---|
| «абв» и «абг» | «в» раньше «г» | «абв» < «абг» |
| «дом» и «дор» | «м» раньше «р» | «дом» < «дор» |
| «лес» и «лесник» | Первая строка закончилась | «лес» < «лесник» |
| «мир» и «мир» | Строки совпадают | \(A=B\) |
Символы можно перебирать обычным циклом, как описано на странице перебор строки. При ручном решении удобно записывать индексы и отмечать первую позицию, где появляется различие.
Какая строка лексикографически меньше?
Алгоритм сравнения строк
При программном сравнении удобно идти по индексам от 0 до длины меньшей строки минус один. На каждой позиции проверяются символы. Как только найдено различие, можно сразу вернуть результат. Если различий нет, сравниваются длины строк: меньшая длина означает меньшую строку.
1. Найдите \(m=\min(|A|,|B|)\). 2. Для \(i\) от 0 до \(m-1\) найдите первый индекс, где \(A[i]\ne B[i]\). 3. Сравните эти символы. 4. Если все первые \(m\) символов равны, сравните длины строк.
1def compare_strings(a, b): 2 m = min(len(a), len(b)) 3 for i in range(m): 4 if a[i] < b[i]: 5 return -1 6 if a[i] > b[i]: 7 return 1 8 if len(a) < len(b): 9 return -1 10 if len(a) > len(b): 11 return 1 12 return 0
Значения результата обычно трактуют так: \(-1\) означает \(A<B\), \(0\) — равенство, \(1\) — \(A>B\). В конкретном языке программирования сравнение строк может быть встроено, но для экзамена важно понимать, какой алгоритм скрывается за операцией сравнения.
Не сравнивайте длины в начале: длинная строка может оказаться меньшей из-за первого символа. Сначала ищите первое различие, а длины проверяйте только после полного совпадения общей части.
Разбор задачи на порядок слов
Рассмотрим набор строк: «мел», «мель», «мак», «море», «мама». Требуется расположить их по возрастанию. Сначала сравним первые символы. Все слова начинаются с «м», поэтому переходим к следующему символу. У слов «мел» и «мель» второй символ «е», у остальных — «а» или «о».
Определим порядок строк «мел» и «мель», а затем найдём первую строку среди списка: «мел», «мель», «мак», «море», «мама».
В последнем шаге важно не перепутать сравнение всей строки и сравнение длины. Например, «море» длиннее «мак», но порядок определился уже на третьем символе: «к» раньше «р». Длина учитывается только для строк, у которых совпала вся общая часть.
Показать решение задачи на сортировку Решение
Если строки хранятся в массиве, можно применить сортировку с обычным сравнением строк. После сортировки первый элемент будет минимальной строкой, последний — максимальной.
1words = ["мел", "мель", "мак", "море", "мама"] 2words.sort() 3print(words)
Результат: [«мак», «мама», «мел», «мель», «море»]. При самостоятельной сортировке сравнивайте соседние элементы и каждый раз используйте правило первого различия.
Сортировка и типичные экзаменационные задачи
В задачах требуется не только отсортировать слова, но и определить, сколько пар находятся в правильном порядке, найти слово с максимальным или минимальным значением, проверить упорядоченность массива строк или построить строку из выбранных элементов.
- Для поиска минимума запомните первую строку, затем сравнивайте её с каждой следующей.
- Для проверки возрастания сравнивайте соседние строки: должно выполняться \(S[i]\le S[i+1]\).
- Для проверки строгого возрастания используйте условие \(S[i]<S[i+1]\).
- Если нужно отсортировать строки по убыванию, меняйте направление сравнения или просматривайте результат сортировки с конца.
- Если строки содержат числа, уточните условие: сравнение как строк и сравнение числовых значений дают разные результаты.
1. Сравнивать длины раньше символов. 2. Считать, что более длинная строка всегда больше. 3. Сравнивать сумму кодов или сумму номеров букв вместо первого различия. 4. Забывать о регистре. 5. Путать лексикографический порядок с числовым: строка «10» может стоять раньше строки «2», потому что «1» раньше «2».
Если строка состоит из цифр и обозначает число, сначала нужно преобразовать её в число или выполнить разбор чисел в строке. Если же условие прямо говорит «слова», «строки» или «символы», используйте лексикографическое сравнение.
Сначала сравниваются символы, затем — длины. Длина учитывается только тогда, когда одна строка полностью совпадает с началом другой.
Проверь себя
Главное
- Лексикографическое сравнение идёт слева направо и останавливается на первом различающемся символе.
- Если одна строка является префиксом другой, меньшей считается более короткая строка.
- Регистр и порядок кодов символов могут влиять на результат, если условие не задаёт иное правило.
- При сортировке строк применяется обычное сравнение: ищите минимум, максимум или проверяйте соседние пары.
- Не смешивайте строковое и числовое сравнение: «12» как строка и число 12 — разные объекты.