我将如何在 PHP 中的 (y) 行上生成 (x) 字串的所有可能行排列?
How would I generate all possible line arrangements of an (x) word string over (y) lines in PHP?
我正在尝试编写一个带有以下 2 个参数的函数:
- 一个句子作为一个字符串
- 整数行数
所以如果我要调用 formatLines("My name is Gary", 2); ...
可能的结果是:
- 数组("My name is", "Gary");
- 数组("My name", "is Gary");
- 数组("My", "name is Gary");
它会 return: array("My name", "is Gary"); 因为每一行的字符数差异很小尽可能。
所以我最终坚持的部分是创建一系列可能的结果,其中单词的顺序正确,分为 x 行。一旦我有了一系列可能的结果,我就会很好地计算出最好的结果。
那么我将如何生成所有可能的组合?
此致
乔
似乎通过创建所有可能的文本拆分方式然后确定最佳方式来执行此操作会不必要地低效。您可以计算字符数并除以行数,以大致找到每行正确的字符数。
function lineSplitChars($text, $lines) {
if (str_word_count($text) < $lines) {
throw new InvalidArgumentException('lines must be fewer than word count', 1);
}
$width = strlen($text) / $lines; // initial width calculation
while ($width > 0) {
$result = explode("\n", wordwrap($text, $width)); // generate result
// check for correct number of lines. return if correct, adjust width if not
$n = count($result);
if ($n == $lines) return $result;
if ($n > $lines) {
$width++;
} else {
$width--;
};
}
}
这里已经接受了一个答案 - 但是当 PHP 已经提供了一个 wordwrap() 函数来完成大部分繁重的工作时,这让我觉得这是一种相当麻烦的解决问题的方法:
function format_lines($str, $lines)
{
$guess_length=(integer)(strlen($str)/($lines+1));
do {
$out=explode("\n", wordwrap($str, $guess_length));
$guess_length++;
} while ($guess_length<strlen($str) && count($out)>$lines);
return $out;
}
就目前而言,它更像是一种蛮力方法,对于非常大的输入,更好的解决方案是使用最优搜索(adding/removing 较大的初始间隔然后在迭代中减少它)
我正在尝试编写一个带有以下 2 个参数的函数:
- 一个句子作为一个字符串
- 整数行数
所以如果我要调用 formatLines("My name is Gary", 2); ...
可能的结果是:
- 数组("My name is", "Gary");
- 数组("My name", "is Gary");
- 数组("My", "name is Gary");
它会 return: array("My name", "is Gary"); 因为每一行的字符数差异很小尽可能。
所以我最终坚持的部分是创建一系列可能的结果,其中单词的顺序正确,分为 x 行。一旦我有了一系列可能的结果,我就会很好地计算出最好的结果。
那么我将如何生成所有可能的组合?
此致
乔
似乎通过创建所有可能的文本拆分方式然后确定最佳方式来执行此操作会不必要地低效。您可以计算字符数并除以行数,以大致找到每行正确的字符数。
function lineSplitChars($text, $lines) {
if (str_word_count($text) < $lines) {
throw new InvalidArgumentException('lines must be fewer than word count', 1);
}
$width = strlen($text) / $lines; // initial width calculation
while ($width > 0) {
$result = explode("\n", wordwrap($text, $width)); // generate result
// check for correct number of lines. return if correct, adjust width if not
$n = count($result);
if ($n == $lines) return $result;
if ($n > $lines) {
$width++;
} else {
$width--;
};
}
}
这里已经接受了一个答案 - 但是当 PHP 已经提供了一个 wordwrap() 函数来完成大部分繁重的工作时,这让我觉得这是一种相当麻烦的解决问题的方法:
function format_lines($str, $lines)
{
$guess_length=(integer)(strlen($str)/($lines+1));
do {
$out=explode("\n", wordwrap($str, $guess_length));
$guess_length++;
} while ($guess_length<strlen($str) && count($out)>$lines);
return $out;
}
就目前而言,它更像是一种蛮力方法,对于非常大的输入,更好的解决方案是使用最优搜索(adding/removing 较大的初始间隔然后在迭代中减少它)