k个连续字符串中最长的

时间:2019-03-23 19:24:57

标签: python string function

我正在定义一个Python函数,以确定是否将原始字符串与每k个连续字符串组合在一起来确定最长的字符串。该函数采用两个参数,documentstrarr

这里是一个示例:

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"

4 个答案:

答案 0 :(得分:2)

对我来说,“每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)

this post提供了替代方案,尽管其中一些难以阅读/冗长

答案 1 :(得分:1)

如果我正确理解您的问题。您必须消除重复的值(在这种情况下,使用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'

答案 2 :(得分:1)

ScrollView
  • 遍历字符串列表,并创建一个新字符串,将其与接下来的k个字符串连接起来
  • 检查新创建的字符串是否最长。如果要记住的话
  • 重复上述步骤,直到迭代完成
  • 返回存储的字符串

答案 3 :(得分:1)

将字符串长度存储在数组中。现在假设一个大小为k的窗口通过此列表。跟踪此窗口中的总和以及该窗口的起点。

当窗口到达数组的末尾时,您应该具有最大的总和和最大发生处的索引。使用此窗口中的元素构造结果。

时间复杂度:O(数组大小+所有字符串大小的总和)〜O(n)

k > array_sizek <= 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)