Бесплатная бета: 30 дней полного доступа, без карты.Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Формы обратной связи и сообщения об ошибке дополнительно используют Google reCAPTCHA для защиты от спама. Она загружается только если вы согласитесь. Политика конфиденциальности

Полевой справочник

DP на строках (word break)

O(n^2)

Булев список ok[i] отмечает, делятся ли первые i символов чисто на слова из словаря. ok[0] изначально true, а ok[i] становится true, как только какое-то более раннее ok[j] равно true и кусок между j и i является настоящим словом.

Сигналы

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

Шаблон

function wordBreak(s, wordDict) {
    const words = new Set(wordDict);
    const ok = new Array(s.length + 1).fill(false);
    ok[0] = true;
    for (let i = 1; i <= s.length; i++) {
        for (let j = 0; j < i; j++) {
            if (ok[j] && words.has(s.slice(j, i))) {
                ok[i] = true;
                break;
            }
        }
    }
    return ok[s.length];
}

Похоже, но не то

  • DP над подпоследовательностями: DP над подпоследовательностями (LIS/LCS/расстояние редактирования) отслеживает самый длинный сохранённый отрезок по одной или двум последовательностям. Word break, наоборот, это просто булев массив по точкам разреза ОДНОЙ строки: ok[i] спрашивает лишь, делятся ли первые i букв на слова из словаря, без какого-либо самого длинного общего отрезка.

длина строки n до ~300..1000, проверка каждой более ранней точки разреза по словарю -> O(n^2) при O(1) проверках через Set/хеш.

Изучить этот паттерн