根据单词之间的空格查找文本的宽度(JAVA)

时间:2018-05-18 22:03:56

标签: java algorithm performance matrix optimization

我一直在研究优化问题,这需要我找到给我最长河流的文字宽度。河流被定义为一系列空间,它们在不同的行中仅由1个或更少的字符分隔。例如,我有以下文字:

这是图像,红色“x”表示河流。

image

- >河流是不同行中的一系列空间,由左边,右边或没有一个字符分隔。我们想要最长的一切。

文本必须与左侧对齐,而不是右侧,如果不适合,则不能分割单词。

我一直在尝试使用每个单词的长度,而不是所有字符序列,以便更好地执行,但我无法以这种方式解决问题。我只能考虑测试所有可能性(最小宽度是最长单词的长度),并获得更好的可能性,但我不认为这在时间和空间上都是有效的。

我不想让你解决这个问题,我只是想知道你是否认为它可以用另一种方式解决。谢谢!

编辑:例如,给定一个文本,我想返回河流的宽度和长度。 image

2 个答案:

答案 0 :(得分:1)

嗯,我觉得没有必要说 是的,你可以 没有一些提示,所以在这里你有......

我相信你应该从定义你所知道的基本问题的规则开始:

假设:

  1. 字符串中的任何位置都不会有两个或多个连续的空格,
  2. 没有自动换行,因此最小宽度将由最长单词的长度决定,
  3. 一条线末端的空白不应被视为河流的一部分(我不确定这是一个正确的规则,因为你可以想象你有一条6线河和一条线的情况其中6个恰好提前完成,因为下一个词太长了。)
  4. 你仍然需要找到最长单词的长度,但这只是设置最小宽度开始。

    所以,你知道:

    1. 你有一个长字符串需要包含在至少三个记录中,这样第三条记录至少有两个字(你需要这个来启用潜在的创建一个3行河,这是最小的,对吗?),
    2. 因此,您可以计算任意行的最大长度,即length of the whole string - length of the last two words - 11是最后两个单词之间的空白)除以2
    3. 通过这些假设和 事实 ,您可以简单地将文本循环部署到矩阵(每个单元格中包含一个字符)并逐行检查河流符合规则。

答案 1 :(得分:0)

你不能让这个alghoritm更有效,因为我没有看到你可以使用的任何模式“我不必尝试这个线宽,它不会给我比这个线宽更好的结果。”

所以基本上你必须尝试找到所有线宽的所有解决方案,并采取最好的。唯一的优化是当你从最小的线宽开始到更大的线宽时,你会发现河流的长度超过了将会出现的行数 - 那么你就不必继续了。

例如 - 如果您发现最长的河流有4个值并且您的线宽达到4行,您可以停止它,因为您无法找到更长的河流。