我遇到了以下问题陈述:
你的句子完全是一行写的。您想通过替换一些空格将其拆分为多行 带有“新行”指标。你的目标是尽量减少宽度 生成的文本中最长的行(“新行”指示符不计算在内 朝着一排的宽度)。您最多可以替换K个空格。
你将获得一个句子和一个K.用句子分割句子 上述程序并返回最长行的宽度。
我有点失落,从哪里开始。对我来说,似乎我需要设法找出满足将单个句子分成K行的标准的每个可能的句子长度。
我可以看到几个边缘情况:
如果这些标准都不成立,那么我们必须确定拆分句子的所有可能组合,并返回所有这些选项的最小值。这是我不知道该怎么做的部分(显然是问题的核心)。
答案 0 :(得分:0)
您想要实现的目标是 Minimum Raggedness 。如果您只想要算法,则为here as a PDF。如果研究论文的链接不好,请搜索Knuth的名为 Breaking Paragraphs into lines 的着名论文。
然而,如果你想在SO的问题Balanced word wrap (Minimum raggedness) in PHP中找到相同的一些实现,人们实际上不仅在PHP中实现了实现,而且在C,C ++和bash中实现了。
虽然这不是一个正确的方法,但如果您正在寻找类似的东西,它会很快而且很脏。对于每种情况,此方法都不会返回正确的答案。对于那些时间运送产品的人来说更重要。
<强>观强>
L
; 答案 1 :(得分:0)
您可以通过反转问题来解决问题。假设我将最长分割的长度固定为L.你能计算出满足它的最小断裂数吗?
是的,你只是在第一个单词之前打破,然后计算它们(O(N))。
所以现在我们必须找到一个需要更少或相等的K断点的最小值L.您可以在输入的长度上进行二进制搜索。最终复杂度O(NlogN)。
答案 2 :(得分:0)
我的递归解决方案,可以通过记忆化或动态编程来改进。
def split(self,sentence, K):
if not sentence: return 0
if ' ' not in sentence or K == 0: return len(sentence)
spaces = [i for i, s in enumerate(sentence) if s == ' ']
res = 100000
for space in spaces:
res = min(res, max(space, self.split(sentence[space+1:], K-1)))
return res