Самая длинная из k последовательных строк - PullRequest
1 голос
/ 23 марта 2019

Я определяю функцию Python для определения самой длинной строки, если исходные строки объединяются для каждых k последовательных строк.Функция принимает два параметра, strarr и k.

Вот пример:

max_consec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2) --> "abigailtheta"

Вот мой код (инстинкт в том, что я неправильно передаю k внутри функции)

def max_consec(strarr, k):
    lenList = []
    for value in zip(strarr, strarr[k:]):
        consecStrings = ''.join(value)
        lenList.append(consecStrings)
    for word in lenList: 
        if max(word):
            return word

Вот тестовый пример не пройден:

testing(longest_consec(["zone", "abigail", "theta", "form", "libe", "zas"], 2), "abigailtheta")

Мой вывод:

'zonetheta' should equal 'abigailtheta'

Ответы [ 4 ]

2 голосов
/ 23 марта 2019

Мне не совсем понятно, что вы подразумеваете под "каждые k последовательных строк", но если вы имеете в виду взятие кусков k-длины из списка и объединение всех строк в каждом слайсе, например

['a', 'bb', 'ccc', 'dddd']  # k = 3

становится

['a', 'bb', 'ccc']
['bb', 'ccc', 'dddd']

, затем

'abbccc'
'bbcccddd'

, тогда это работает ...

# for every item in strarr, take the k-length slice from that point and join the resulting strings
strs = [''.join(strarr[i:i + k]) for i in range(len(strarr) - k + 1)]

# find the largest by `len`gth
max(strs, key=len)

этот пост дает альтернативы, хотя некоторыеиз них трудно читать / многословно

1 голос
/ 23 марта 2019

Сохранение длин строк в массиве. Теперь предположим, что окно размера k проходит через этот список. Следите за суммой в этом окне и отправной точкой окна.

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

Сложность по времени: O (размер массива + сумма всех размеров строк) ~ O (n)

Также добавьте некоторую обработку угловых случаев, когда k > array_size или k <= 0

def max_consec(strarr, k):

    size = len(strarr)

    # corner cases
    if k > size or k <= 0:
        return "None"  # or None

    # store lengths
    lenList = [len(word) for word in strarr]

    print(lenList)

    max_sum = sum(lenList[:k])   # window at index 0
    prev_sum = max_sum
    max_index = 0

    for i in range(1, size - k + 1):
        length = prev_sum - lenList[i-1] + lenList[i + k - 1]  # window sum at i'th index. Subract previous sum and add next sum
        prev_sum = length

        if length > max_sum:
            max_sum = length
            max_index = i

    return "".join(strarr[max_index:max_index+k])  # join strings in the max sum window


word = max_consec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2)

print(word)
1 голос
/ 23 марта 2019
def max_consec(strarr, k):
    n = -1
    result = ""
    for i in range(len(strarr)):
        s = ''.join(strarr[i:i+k])
        if len(s) > n:
            n = len(s)
            result = s     
    return result
  • Переберите список строк и создайте новую строку, соединив ее со следующими k строками
  • Проверьте, является ли вновь созданная строка самой длинной.Если это так, запомните его
  • Повторяйте вышеупомянутые шаги до завершения итераций
  • возвращайте запомненную строку
1 голос
/ 23 марта 2019

Если я правильно понимаю ваш вопрос. Вы должны исключить повторяющиеся значения (в данном случае с set), отсортировать их по длине и объединить k самых длинных слов.

>>> def max_consec(words, k):
...   words = sorted(set(words), key=len, reverse=True)
...   return ''.join(words[:k])
...
>>> max_consec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2)
'abigailtheta'

Обновление: Если k элементов должны быть последовательными. Вы можете создавать пары последовательных слов (в данном случае с zip). И верните самое длинное, если они присоединятся.

>>> def max_consec(words, k):
...     return max((''.join(pair) for pair in zip(*[words[i:] for i in range(k)])), key=len)
...
>>> max_consec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2)
'abigailtheta'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...