Как выполнить тестовое задание, требующее убрать стоящие рядом одинаковые слова за один цикл?

Рейтинг: -1Ответов: 2Опубликовано: 23.08.2023

Есть такая строка. car car was driving car was driving;

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

Тоесть на выходе должны получить вот эту строку - car was driving car was driving

И нужно использовать не больше одного цикла. Регулярное выражение тоже подойдет.

Для наглядности скажу что ՝explode՝, implode то же циклы.

Как можно это сделать на php.

Ответы

▲ 0Принят

Наконец то нашел решение этой задачи.

Вот примерно так.

Если буду другие варианты, с удовольствием посмотрю.

$string = "car car was driving car was was driving";
$outputString = "";
$word = "";
$prevWord = "";

for ($i = 0; $i <= strlen($string); $i++) {
    $char = $i < strlen($string) ? $string[$i] : " ";

    if ($char !== " ") {
        $word .= $char;
    } else {
        if ($word !== $prevWord) {
            $outputString .= $word !== "" ? " " . $word : $word;
        }
        $prevWord = $word;
        $word = "";
    }
}
echo $outputString;
▲ 1

Не совсем понял почему вариант с регулярным выражением не устроил, но добавлю как ответ:

$str = 'car car was driving car was driving
car was was driving
car was driving driving
один один два три
один два два три три четыре
один два три четыре четыре';

$result = preg_replace('/\b(\p{L}+)(?:\s+\1\b)+/u', "$1", $str);

echo $result;
//car was driving car was driving
//car was driving
//car was driving
//один два три
//один два три четыре
//один два три четыре

О регулярном выражении:

\b(\p{L}+)(?:\s+\1\b)+

\b - так называемая граница слова
(...) - группа для захвата данных
\p{L}+ - один и более языковой символ (вон как в комментариях выше товарищ не забыл, что без параметра u с кириллицей работать не будет)
(?:...) - группа не захватывающая данные, нужна для квантификации, если слово повторяется более 2х раз
\s+ - один и более пробельных символов, по идее можно заменить на \h+ - один и более горизонтальных символов, что бы слово на новой строке не учитывалось если такое же есть в конце предыдущей сроки
\1 - возвращение захватываемой группы, т.е. на это место подставятся данные которые были захвачены в круглых скобках ранее.

Заменяется все на $1 что так же является данными захваченными в первую группу, что бы осталось одно слово из множества повторяющихся.