3

я наткнулся на проблему разрыва слово, которое идет что-то вроде этого:Слово Перерыв Трудоемкость

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

Например, если входной является строка «applepie» и словарь содержит стандартный набор английских слов, то мы бы вернуть строку «яблочный пирог», как выход

Теперь я сам придумал квадратичное временное решение. И я наткнулся на различные other quadratic time solutions using DP.

Однако в Quora пользователь разместил linear time solution to this problem

Я не могу понять, как это выходит быть линейным. Это их ошибка в расчетах временной сложности? Какое максимальное возможное значение имеет сложную временную сложность для решения этой проблемы. Я отправляю наиболее общее решение DP здесь

String SegmentString(String input, Set<String> dict) { 
    int len = input.length(); 
    for (int i = 1; i < len; i++) { 
     String prefix = input.substring(0, i); 
     if (dict.contains(prefix)) { 
       String suffix = input.substring(i, len); 
       if (dict.contains(suffix)) { 
        return prefix + " " + suffix; 
       } 
     } 
    } 
    return null; 
} 
+1

Как неоднозначность должна быть решена? 'expertsexchange => [эксперт, пол, изменение], [эксперты, обмен]' – mishadoff

+0

Линейное временное решение работает только в случае двух слов. Каково ваше требование? Простейшее общее решение включает в себя создание набора мощности из 2^n элементов, DP может сделать его быстрее O (n^2). –

+0

, очевидно, еще один линейный тайм-алго можно найти по этой ссылке http://stackoverflow.com/questions/8793387/how-to-break-down-a-given-text-into-words-from-the-dictionary?rq= 1 посмотрим на второй ответ –

ответ

0

«линейный» время алгоритм, который вы linked here работает следующим образом:

Если строка sharperneedle и словарь sharp, sharper, needle,

  1. It толкает sharp в строку.
  2. Затем он видит, что er не в словаре, но если мы объединим его с последним добавленным словом, то sharper существует. Поэтому выскакивает последний элемент и толкает это в.

IMO выше логика не выполняется для строки eaterror и словаря eat, eater, error.

Здесь er должен выскочить из списка и нажать eater. Оставшаяся строка ror не должна распознаваться и отбрасываться.

Что касается кода, который вы опубликовали, как указано в комментариях, это работает только для двух слов с одним разделом.

+0

@ Erti-ChrisEelmaa Описание алгоритма соответствует ссылке http://www.quora.com/Programming-Interviews/Write-a-program-that-breaks-up-a-string -of-words-with-no-spaces-in-a-string-with-appro-spaces-eg-ip-peanutbutter-op-aaranut-butter/answer/Gaurav-Mishra-29, данные OP, а не код , –

Смежные вопросы