2015-02-27 12 views
0

Я видел этот псевдокод на другом вопросе stackoverflow, который здесь найден Split a string to a string of valid words using Dynamic Programming.Не уверен, что говорит этот псевдокод

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

Третья строка означает установить массив b размера [N + 1] для всех ложных значений? Я в этом почти уверен. Но я действительно не уверен в пятой строчке. Это для цикла или что? Я чувствую, что псевдокод, говорящий, что «для i в диапазоне» будет иметь только 2 значения. Что это за линия?

def try_to_split(doc): 
    N = len(doc) 
    b = [False] * (N + 1) 
    b[N] = True 
    for i in range(N - 1, -1, -1): 
     for word starting at position i: 
     if b[i + len(word)]: 
      b[i] = True 
      break 
    return b 

ответ

0

Это путаный синтаксис, и я уверен, что есть ошибка. Оно должно быть:

for i in range(N - 1, 0, -1) //0, not -1 

, который я считаю, означает

for i from (N - 1) downto 0 //-1 was the step, like i-- or i -= 1 

Это имеет смысл с алгоритмом, так как он просто начинает в конце строки, и решает каждую заднюю подстроку, пока не дойдет до начало. Если b [0] равно true в конце, тогда входная строка может быть разделена на слова из словаря. for word starting at position i просто проверяет все слова в словаре, чтобы узнать, начинают ли они в этой позиции.

Если кто-то хочет, чтобы иметь возможность восстановить решение, они могут изменить b на целочисленный массив, инициализация 0s, и изменить if к этому:

if b[i + len(word)] != 0 
    b[i] = i + len(word) //len(word) works too 
    break 
+0

Спасибо. Я считаю, что это тоже ошибка, и ваша ревизия делает код более понятным. Но в чем смысл создания b массива int вместо булевского массива? –

+0

Предположим, что мы устанавливаем 'b [i]' на 'i + len (word)'. Тогда, если есть решение, 'b [i]! = 0'. Затем мы можем найти фактическое решение, взяв слово от 'i = 0' до' i = b [0] ', а затем повторим на' b [b [0]] 'до тех пор, пока мы не дойдем до конца строки. –

+0

Извините, что вы подразумеваете под "фактическим решением"? Я не вижу, как использование метода с булевым массивом не работает. –

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