Все темы
118

Можно ли разрезать текст на слова из словаря?

Tier 2Закрыто

Где применяется

1. Задача

У тебя одна длинная строка букв без пробелов, например "leetcode", и словарь известных слов, например ["leet", "code"]. Вопрос простой: можно ли разрезать строку на целые слова так, чтобы каждое из них было в словаре? Одно слово можно брать сколько угодно раз. Пустая строка тоже считается разрезанной: в ней ноль слов.

"leetcode" режется на "leet" и "code", поэтому ответ да. "applepenapple" режется на "apple", "pen", "apple", слово "apple" взято дважды, и ответ снова да.

Теперь "catsandog" со словарём ["cats", "dog", "sand", "and", "cat"]. Кажется, что должно получиться: "cats", потом "and", потом остаётся "og", а это не слово. Пробуешь "cat", "sand", и снова остаётся "og". При любом разрезе остаётся хвост, поэтому ответ нет. Брать первое подходящее слово нельзя. Нужно знать, режется ли на слова остаток строки.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Разрезать строку на слова из словаря
wordBreak("catsdog", ["cat", "cats", "dog"])
s
c
a
t
s
d
o
g
ok[i]: T, если первые i букв режутся на слова
T
F
F
F
F
F
F
F
wordDict
catcatsdog
piece = -

Можно ли разрезать "catsdog" на слова из словаря? ok[0] истинно: пустому префиксу слова не нужны.

Гонка скорости
Разбиение строки "aaaaaaaaaaaab" на слова a, aa, aaa: простая рекурсия и таблица по префиксам

Столбики: сколько проверок по словарю начиналось с каждой позиции строки.

Одна операция: одна проверка по словарю. За каждый кадр все дорожки делают одинаковое число операций, поэтому медленная отстаёт.

Простая рекурсия O(2ⁿ)
операций: 0
Таблица по префиксам O(n²)
операций: 0

 

А если чисел больше

Операции для n чисел и примерное время при 100 миллионах простых операций в секунду. Это оценка по тому же счёту, а не замер.

n = 20
Простая рекурсия317 тыс. · 3,2 мс
Таблица по префиксам175 · меньше 1 мс
n = 40
Простая рекурсия62,2 млрд · 10 мин
Таблица по префиксам745 · меньше 1 мс
n = 60
Простая рекурсия12 220,2 трлн · 3,9 лет
Таблица по префиксам1,7 тыс. · меньше 1 мс

Как узнать

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

Эти слова в условии значат этот паттерн

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

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

n символов при словах до m дают O(nm). Множество или trie держат поиск около O(1).

На LeetCode

Задачи, где строку режут на куски из словаря или на допустимые коды и спрашивают, получится ли, сколькими способами или какой разрез дешевле. ok[i] говорит, что первые i букв режутся без остатка, и он берётся из любого раннего разреза j, где ok[j] true, а кусок от j до i допустим.

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