Добавить в корзинуПозвонить
Найти в Дзене
Записки о Java

LeetCode 58: Length of Last Word — Длина последнего слова

Уровень сложности: Лёгкая (Easy)
Теги: Строка, Обработка текста Дана строка s, состоящая из английских букв и пробелов ' '.
Верните длину последнего слова в строке. Слово — это максимальная подстрока, состоящая только из непробельных символов. Пример 1: Ввод: s = "Hello World" Вывод: 5 Объяснение: Последнее слово — "World", его длина = 5. Пример 2: Ввод: s = " fly me to the moon " Вывод: 4 Объяснение: Последнее слово — "moon". Пример 3: Ввод: s = "luffy is still joyboy" Вывод: 6 Объяснение: Последнее слово — "joyboy". На первый взгляд можно просто: Но! В строке могут быть лидирующие и завершающие пробелы, а также множественные пробелы между словами.
Например: " a " → split(" ") даст ["", "", "", "a", "", ""], и последний элемент — пустая строка! Хотя в Java String.split() с регулярным выражением по умолчанию игнорирует завершающие пустые строки, это поведение неочевидно и зависит от реализации. Это: 💡 Это решение не использует дополнительную память (кроме пары переменных) и раб
Оглавление
Рисунок: задача Length of Last Word
Рисунок: задача Length of Last Word

Уровень сложности: Лёгкая (Easy)
Теги: Строка, Обработка текста

📌 Условие задачи

Дана строка s, состоящая из английских букв и пробелов ' '.
Верните
длину последнего слова в строке.

Слово — это максимальная подстрока, состоящая только из непробельных символов.

Пример 1:

Ввод: s = "Hello World"

Вывод: 5

Объяснение: Последнее слово — "World", его длина = 5.

Пример 2:

Ввод: s = " fly me to the moon "

Вывод: 4

Объяснение: Последнее слово — "moon".

Пример 3:

Ввод: s = "luffy is still joyboy"

Вывод: 6

Объяснение: Последнее слово — "joyboy".

🔍 Анализ задачи

На первый взгляд можно просто:

  1. Разделить строку по пробелам (split(" "))
  2. Взять последний элемент
  3. Вернуть его длину

Но! В строке могут быть лидирующие и завершающие пробелы, а также множественные пробелы между словами.
Например: " a " → split(" ") даст ["", "", "", "a", "", ""], и последний элемент — пустая строка!

Хотя в Java String.split() с регулярным выражением по умолчанию игнорирует завершающие пустые строки, это поведение неочевидно и зависит от реализации.

Лучший подход: обход с конца строки

  • Начинаем с последнего символа.
  • Пропускаем все завершающие пробелы.
  • Затем считаем непробельные символы, пока не встретим пробел или начало строки.

Это:

  • Работает за один проход с конца
  • Не создаёт лишних объектов (в отличие от split)
  • Явно обрабатывает все краевые случаи

Решение на Java

Рисунок: решение задачи
Рисунок: решение задачи

Комментарии к коду:

  • index начинается с последнего символа (s.length() - 1).
  • Первый цикл гарантирует, что мы начинаем с последней буквы, а не с пробела.
  • Второй цикл считает символы, пока не встретит пробел или не выйдет за границу строки.
  • Если строка пустая или состоит только из пробелов — оба цикла пропустят всё, и вернётся 0 (что корректно).
💡 Это решение не использует дополнительную память (кроме пары переменных) и работает за O(n) в худшем случае, но на практике часто быстрее — особенно если последнее слово короткое.

Объяснение «словами пятилетнего»

Представь, у тебя есть лента с надписью, например:
« кот прыгает на диван »

Ты хочешь узнать, сколько букв в самом последнем слове — то есть в слове «диван».

Но в конце ленты могут быть лишние пробелы (пустые места), как будто кто-то оставил пустое место после надписи.

Ты берёшь палец и начинаешь с самого конца ленты, идёшь влево, пока не увидишь первую букву.

А потом продолжаешь идти влево и считаешь буквы, пока не наткнёшься на пробел.

Сколько насчитал? Пять! Значит, последнее слово — из пяти букв 😊

Заключение

Пример, рассмотренный в статье, можно найти по адресу:
https://github.com/ShkrylAndrei/leetcode/blob/main/src/main/java/info/shkryl/task58_lengthOfLastWord/Solution.java