我正在定义一个Python函数,以确定是否将原始字符串与每k个连续字符串组合在一起来确定最长的字符串。该函数采用两个参数,document
和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"
答案 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
答案 3 :(得分:1)
将字符串长度存储在数组中。现在假设一个大小为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)