Тестирование палиндрома часть 3

Тестирование палиндрома - часть 3

Во второй части урока мы нашли лучший способ удалить все символы, кроме букв, чтобы протестировать палиндром..

В этом уроке мы рассмотрим, как проверить, является ли текст, который мы тестируем, одинаковым в обратном и обратном порядке. Другими словами — палиндром ли это.

Сравниваем букву за буквой, беря первое и последнее, затем второе и предпоследнее и т. Д..

Принимая конкретное письмо

Получить букву из строки можно с помощью функции substr (). Эта функция уже должна быть знакома из учебника по текстовым функциям..

Эта функция принимает 3 аргумента:

  1. строка, из которой мы хотим «вырезать» кусок
  2. Начальная позиция
  3. длина сегмента

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

Чтобы:

substr (‘какой-то текст’, 5);

вернет «текст», потому что мы пропустим первые 5 символов (включая пустое пространство) и вернем текст до конца.

Если у нас есть:

substr (‘какой-то текст’, 0, 1);

это вернет "s". Мы не пропустим никаких знаков. Начнем с начала и вернем строку длиной в 1 букву.

Таким образом мы можем взять первое, второе и так далее. буква текста.

Сбор букв взад и вперед

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

substr (‘какой-то текст’, -1, 1);

вернет "т" — последнюю букву.

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

Читать также:  Начало работы с JavaScript часть 2

Вы можете представить это, как если бы текст был обернут вокруг чего-то круглого. Когда мы возвращаемся от первой буквы 1, мы переходим к последней. Однако эта аналогия не совсем верна, так как:

substr (‘какой-то текст’; -2);

вернет только "xt". Опять же, когда достигается конец текста, функция останавливается и возвращает результат. Без учета описанной выше "круговой" функциональности.

Циклический цикл всех букв предложения

Итак, первую букву (аргумент 0) мы должны сравнить с -1, вторую букву (1) мы должны сравнить с -2. Перед тем, как приступить к написанию кода, хорошо иметь в виду 1-2 цикла выборки. Тогда эту разницу в абсолютных значениях (модуле) чисел необходимо учитывать..

Следует также учитывать вариант последней буквы. В одном случае это будет 11, а в другом не может быть -12. Нет 12 букв, и мы не можем вернуться так далеко.

В этом случае необходимо произвести проверку и взять первую букву с индексом 0..

Поэтому мы должны сравнивать результаты этой функции, вызываемой аналогичным образом, столько раз, сколько букв в исходном тексте. Поскольку мы будем выполнять одну и ту же операцию несколько раз, лучше всего использовать цикл. Единственное, что необходимо указать, — это сколько раз будет выполняться цикл. Фактически — мы уже сказали — столько раз, сколько букв в тексте. И мы можем понять это с помощью функции strlen ():

Читать также:  Массивы в PHP (часть 2) пользовательские ключи

# подготавливаем строку для тестирования $ test = ‘If I Had a Hi-Fi’;
# удаляем все символы, кроме букв $ упрощенный = preg_replace (‘/ \ W /’, », $ test);
# по соединению текст является палиндромом; как только мы обнаружим, что это не так, мы изменим этот флаг $ is_palindrome = true;
# мы выполняем тело цикла столько раз, сколько букв в $ упрощенный for ($ i = 0; $ i strlen ($ упрощенный); $ i ++) {$ index_b = — ($ i + 1);
если ($ index_b — (strlen ($ упрощенный))) {$ index_b = 0; }
# берем первую букву $ a = substr ($ упрощенный, $ i, 1);
# берем последнюю букву $ b = substr ($ упрощенный, $ index_b, 1);
# убедитесь, что первая и последняя буквы совпадают if ($ a! = $ b) {# если они не совпадают — обратите внимание, что текст, который мы тестируем, не является палиндромом $ is_palindrome = false; }}
# вывод результата var_dump ($ is_palindrome);

Но это не работает, потому что оказывается ложным..

Прописные и строчные буквы

Почему это происходит? Потому что буквы могут быть строчными и прописными, и тогда они не совпадают. Мы можем исправить это с помощью простой strtolower () после удаления лишних символов. Ничто не мешает нам сделать это раньше.

Оптимизация

Прежде чем мы посмотрим на обновленный код — давайте посмотрим, что еще мы можем оптимизировать.

Читать также:  Начало работы с JavaScript

Мы можем уменьшить количество повторений цикла. Если первая у нас совпадает с серединой — больше проверок делать не нужно. Фактически мы повторяем то, что уже сделали.

Следовательно, мы можем изменить условие $ i strlen ($ упрощенное), чтобы оно было вдвое меньше.

В этом случае также отбрасываются проверки для $ index_b, что также сокращает код..

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

Мы можем преждевременно завершить цикл с помощью ключевого слова break:

$ test = ‘Если бы у меня был Hi-Fi’;
$ упрощенный = preg_replace (‘/ \ W /’, », $ test); $ упрощенный = strtolower ($ упрощенный);
$ is_palindrome = true;
$ повторение = strlen ($ упрощенное);
# достаточно проверить до середины, так как ожидается зеркало $ repetition = $ repetition / 2;
for ($ i = 0; $ i $ повторение; $ i ++) {$ a = substr ($ упрощенный, $ i, 1); $ b = substr ($ упрощенный, — ($ i + 1), 1);
# строгая проверка работает немного быстрее if ($ a! == $ b) {$ is_palindrome = false;
# больше проверок делать не нужно — уже ясно, что это не палиндром разрыва; }}
var_dump ($ is_palindrome);

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

В следующем уроке мы рассмотрим другой способ, который не только быстрее, чем компьютеры, но и намного короче (следовательно, прост для программистов)..

Понравилась статья? Поделиться с друзьями:
Что нужно знать пользователю?