拆分句子以最小化句子长度

时间:2015-10-07 03:20:46

标签: algorithm

我遇到了以下问题陈述:

  

你的句子完全是一行写的。您想通过替换一些空格将其拆分为多行   带有“新行”指标。你的目标是尽量减少宽度   生成的文本中最长的行(“新行”指示符不计算在内   朝着一排的宽度)。您最多可以替换K个空格。

     

你将获得一个句子和一个K.用句子分割句子   上述程序并返回最长行的宽度。

我有点失落,从哪里开始。对我来说,似乎我需要设法找出满足将单个句子分成K行的标准的每个可能的句子长度。

我可以看到几个边缘情况:

  1. 句子中有< = K个单词,因此返回最长的单词。
  2. 句子长度为0,返回0
  3. 如果这些标准都不成立,那么我们必须确定拆分句子的所有可能组合,并返回所有这些选项的最小值。这是我不知道该怎么做的部分(显然是问题的核心)。

3 个答案:

答案 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;
  • 当放入 K 中断时,最好的方案是能够将字符串分解为 L /(K + 1)大小的部分;
  • 所以在那个单词上打破你的字符串会使得句子的长度与 L /(K + 1)相距甚远;

答案 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