Это дополнительный вопрос к этот ответ и алгоритм псевдокода, опубликованный пользователем. Я не комментировал этот вопрос из-за его возраста. Меня интересует только проверка того, можно ли разбить строку на слова. Алгоритму не нужно на самом деле разбивать строку. Это ответ на связанный вопрос:
Пусть S[1..length(w)] — таблица с булевыми записями. S[i] истинно, если слово w[1..i] можно разделить. Затем установите S[1] = isWord(w[1]) и для i=2 до length(w) вычислите
S[i] = (isWord[w[1..i] или для любого j в {2..i}: S[j-1] и isWord[j..i]).
Я перевожу этот алгоритм в простой код Python, но я не уверен, правильно ли я его понимаю. Код:
def is_all_words(a_string, dictionary)):
str_len = len(a_string)
S = [False] * str_len
S[0] = is_word(a_string[0], dictionary)
for i in range(1, str_len):
check = is_word(a_string[0:i], dictionary)
if (check):
S[i] = check
else:
for j in range(1, str_len):
check = (S[j - 1] and is_word(a_string[j:i]), dictionary)
if (check):
S[i] == True
break
return S
У меня есть два связанных вопроса. 1) Является ли этот код правильным переводом связанного алгоритма на Python, и если это так, 2) Теперь, когда у меня есть S, как мне использовать его, чтобы определить, состоит ли строка только из слов ? В данном случае is_word
— это функция, которая просто ищет заданное слово в списке. Я еще не реализовал это как попытку.
ОБНОВЛЕНИЕ: после обновления кода для включения предложенного изменения он не работает. Это обновленный код:
def is_all_words(a_string, dictionary)):
str_len = len(a_string)
S = [False] * str_len
S[0] = is_word(a_string[0], dictionary)
for i in range(1, str_len):
check = is_word(a_string[0:i], dictionary)
if (check):
S[i] = check
else:
for j in range(1, i): #THIS LINE WAS UPDATED
check = (S[j - 1] and is_word(a_string[j:i]), dictionary)
if (check):
S[i] == True
break
return S
a_string = "carrotforever"
S = is_all_words(a_string, dictionary)
print(S[len(S) - 1]) #prints FALSE
a_string = "hello"
S = is_all_words(a_string, dictionary)
print(S[len(S) - 1]) #prints TRUE
Он должен вернуть True
для обоих из них.