algorithm - 如何有效地为特定宽度的字符串找到理想的列数?

我有 n 个不同长度的字符串 s1, s2, ..., sn 我想在 c 列中显示在终端上。终端的宽度为 m 个字符。每列 i 具有一定的宽度 wi,该宽度等于该列中最长条目的宽度。每对列之间都有一定的空间s。包括间距在内的所有列的总宽度不能大于终端的宽度(w1 + w2 + ... + wc + (c - 1) ·s ≤ m)。每列应包含 ⌈n/c⌉ 字符串,除非 n 不能被 c 整除,在这种情况下,最后几列应缩短一个条目或仅最后一列更短,具体取决于字符串是横向排列还是向下排列。

是否有一个有效的(例如O(n·w) where w = max(w1, w2, ..., wn)) 算法来找出我可以放入 c 列,如果...

  • 字符串是跨行排列的

    string1 string2  string3 string4
    string5 string6  string7 string8
    string9 string10
    
  • 字符串向下排列

    string1 string4 string7 string10
    string2 string5 string8
    string3 string6 string9
    

?

后来的发现

我发现 s 并不重要。 s > 0 的每个问题实例都可以通过用 s 个字符扩展每个字符串并扩展来转换为 s = 0 的实例终端的宽度由 s 个字符来补偿屏幕末尾额外的 s 个字符。

最佳答案

不幸的是,我认为最快的算法是 O(n^2)。这是因为您可以确定是否可以在列表的单次传递中对 c 列进行配置,但您不知道更改 c 的程度,所以基本上您只需要为它尝试不同的值。最多你的算法会这样做 n 次。

这是我如何做的伪代码

for c = n.size, c > 0, c --
  remainingDist = m - c*s
  for i = 1, i <= c, i ++ 
    columnWidth = 0
    for j = i, j <= n.size; j += c
      columnWidth = max(n[j], columnWidth)
    end
    remainingDist -= columnWidth
  end
  if remainingDist >= 0
    success
    columns = c
    break
  end
end

您可以通过首先计算项目的平均大小并从中计算出“理想”的列数来跳转到循环的中途。

https://stackoverflow.com/questions/24411759/

相关文章:

visual-studio - Visual Studio 格式化 - 更改方法颜色

SQL Server 2005 For XML Explicit - 需要帮助格式化

c# - 如何拆分保留整个单词的字符串?

c# - 日期时间格式,如 HH :mm 24 Hours without AM/PM

java - 任何可用于 java 文件的命令行格式工具?

java - Eclipse 格式化程序 : can it ignore annotations?

android - 如何格式化GPS经纬度?

c++ - clang-format:总是打破所有参数,每行一个

php - 在 PHP 中从 SQL 格式化时间戳的最简单方法是什么?

javascript - 从字符串,javascript 中获取 x 像素值文本的最可靠方法