Алгоритмы вопроса о подсчете строк в абзаце - PullRequest
0 голосов
/ 07 апреля 2020

У меня небольшая проблема, когда я пытаюсь найти эффективный алгоритм для решения этой проблемы. Вам дана длинная строка s = "a bcd ef ghi jk lmn opq ghfdj ashks jahksjh jahkdaj jhakjd akjsdhka hskadjhka hkjdhak dkahsdkhsakjdhksah"

и максимальная длина строки, целое число max макс = 6 = строка, сколько строк потребуется, чтобы уместить строку

***, вы не можете разбить строку в середине слова ****, например:

input :

s="a bcd e f ghi j k lmn opq ghfdj ashks", maxLine = 6

первая строка: bcd

вторая строка: ef

третья строка: ghi j

Я пытаясь решить это алгоритмически не с помощью пакета

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Вот довольно эффективное решение, оно требует только одного прохода над строкой.

Мы отслеживаем начало следующей строки как line_start_index, затем итерируем по каждому символу и отслеживаем последний пробел рассматривается как line_end_index.

Каждый раз, когда мы повторяем 6 символов из line_start_index, мы знаем, что следующая строка - это подстрока s[line_start_index:line_end_index]. Затем мы устанавливаем line_start_index как конец предыдущей строки.

line_start_index = 0
line_end_index = 0
total = 0
for i, c in enumerate(s):
    if c == ' ':
        line_end_index = i
    if i - line_start_index == 6:
        # TODO: Handle words longer than 6 chars (line_start_index == line_end_index + 1)
        print('Found line!', s[line_start_index:line_end_index])
        total += 1
        line_start_index = line_end_index + 1

# For the data you have given there will be one additional line after the loop
# this may not be correct if the last char is a space
print('Found line!', s[line_start_index:])
total += 1
print(total)

Это дает вывод:

Found line! a bcd
Found line! e f
Found line! ghi j
Found line! k lmn
Found line! opq
Found line! ghfdj
Found line! ashks
7

Это не будет работать, если слово длиннее 6 chars, но, как вы сказали, нет необходимости обрабатывать это

0 голосов
/ 07 апреля 2020

Решение с использованием регулярного выражения

>>> re.findall(r'\b.{1,6}\b', s)
['a bcd ', 'e f ', 'ghi j ', 'k lmn ', 'opq ', 'ghfdj ', 'ashks']
>>> len(_)
7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...