главная новое лучшее написать
3

Сегодня разберём ещё одну простую задачу 1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence.

Описание задачи 📜

Дана строка sentence, состоящая из слов, разделённых пробелами, и строка searchWord. Нужно определить индекс (считаем с 1), где searchWord является префиксом какого-либо слова в sentence. Если такого слова нет — вернуть -1.

Решение 🛠️

Идея 💡

Задача сводится к простому проходу по словам строки. Мы должны проверить каждое слово: начинается ли оно с searchWord. Возвращаем индекс первого подходящего слова.

Алгоритм 🚀

  1. Разделяем строку sentence на слова с помощью метода split_whitespace, который возвращает ссылки на части исходной строки.
  2. Проходим по словам с их индексами через enumerate.
  3. Для каждого слова проверяем, начинается ли оно с searchWord с помощью метода starts_with.
  4. Если находим соответствие, возвращаем индекс (преобразуем его в формат 1-based). Если совпадений нет, возвращаем -1.

Анализ Сложности 📊

Исходный код решения

impl Solution {
    pub fn is_prefix_of_word(sentence: String, search_word: String) -> i32 {
        // Split the sentence into words using whitespace as a delimiter
        let words = sentence.split_whitespace();

        // Iterate through the words with their indices
        for (index, word) in words.enumerate() {
            // Check if search_word is a prefix of the current word
            if word.starts_with(&search_word) {
                return (index + 1) as i32; // Convert 1-based index to i32 and return
            }
        }

        -1 // Return -1 if no prefix match is found
    }
}

1 anonymous 02-12-2024

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

ответить
1 leetcoder 02-12-2024

Даже в этом решении, если заглянуть глубже split_whitespace не массив слайсов возвращает, а итератор по ним
sruct.SplitWhitespace. В спецификации его характеристики по дополнительной памяти не уточняются, но вполне возможно реализовать такой итератор на константных костах. И можно обсудить как сделать итератор с такими гарантиями самостоятельно.

ответить
1 anonymous 02-12-2024

А, и правда. Я не пишу на Rust и не знал, что там split возвращает итератор.

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

ответить
1 leetcoder 02-12-2024

Мне на самом деле практика именно задач через LeetCode не очень нравится тем, что тесты уже даются системой.
Интересная часть, в которой кандидат сам придумывает крайние случаи для своего кода исключаются.
Я понимаю, с другой стороны, что это идёт в угоду сокрашения времени. Меж тем это всё-равно самая важная часть отладки на мой взгляд, позволяющая отсечь тех кто программирует сам, от использующих ChatGPT.

ответить