显示可能的字符串组合
Posted
技术标签:
【中文标题】显示可能的字符串组合【英文标题】:Display possible combinations of string 【发布时间】:2011-03-13 03:09:55 【问题描述】:我正在尝试获取一个字符串并显示它的可能组合(在 php 中),但同时按每个单词的顺序说。例如:“你好吗”将返回(一个数组)
How are you
How are
are you
how
you
are
我现在拥有的代码显示所有组合,但我希望它保持它们的顺序而不是翻转单词。任何人有任何想法或他们愿意分享的sn-ps?谢谢
【问题讨论】:
你用的是什么代码? 【参考方案1】:设置两个迭代器并打印它们之间的所有内容。所以是这样的:
<?
$str = "How are you";
$words = explode(" ",$str);
$num_words = count($words);
for ($i = 0; $i < $num_words; $i++)
for ($j = $i; $j < $num_words; $j++)
for ($k = $i; $k <= $j; $k++)
print $words[$k] . " ";
print "\n";
?>
输出
How
How are
How are you
are
are you
you
【讨论】:
效率低下比比皆是! $str = "你好吗"; $words = explode(" ",$str); $total_words = count($words); for ($i = 0; $i 如果你不想要多余的空间并希望结果是一个数组,只需将push
$words[$k]
放入一个数组然后implode
它,将结果添加到数组中被退回。
此方法在字符串包含 4 个以上单词时不起作用,例如:'a b c d' - 不会返回 'a c d' 组合【参考方案2】:
我知道这是一个很老的帖子,但另一个答案不是很灵活,所以我想我会带来一个新的答案。
说明
所以你正在寻找所有的组合:
(2n) - 1
在您的具体示例中是:
(23) - 1 = (8) - 1 = 7
那么我现在如何获得所有组合?我们循环遍历我们已经拥有的所有组合(从一个组合开始,一个“空组合”($results = [[]];
)),对于每个组合,我们遍历数组中的下一个单词并将每个组合与每个新组合词到一个新的组合。
示例
Array with the words/numbers (Empty array is '[]'):
[1, 2, 3]
//↓new combinations for the next iteration
│
iteration 0:
Combinations:
- [] │ -> []
│
iteration 1: ┌─────────────┤
│ │
Combinations: v v
- [] + 1 │ -> [1]
│
iteration 2: ┌─────────────┤
│ │
Combinations: v v
- [] + 2 │ -> [2]
- [1] + 2 │ -> [1,2]
│
iteration 3: ┌─────────────┤
│ │
Combinations: v v
- [] + 3 │ -> [3]
- [1] + 3 │ -> [1,3]
- [2] + 3 │ -> [2,3]
- [1,2] + 3 │ -> [1,2,3]
//^ All combinations here
所以你可以看到总有:(2^n)-1
组合。同样通过这种方法,组合数组中还剩下一个空数组,因此在返回数组之前,我只需使用array_filter()
删除所有空数组并使用array_values()
重新索引整个数组。
代码
<?php
$str = "how are you";
function getCombinations($array)
//initalize array
$results = [[]];
//get all combinations
foreach ($array as $k => $element)
foreach ($results as $combination)
$results[] = $combination + [$k => $element];
//return filtered array
return array_values(array_filter($results));
$arr = getCombinations(explode(" ", $str));
foreach($arr as $v)
echo implode(" ", $v) . "<br />";
?>
输出:
how
are
how are
you
how you
are you
how are you
【讨论】:
但是“你怎么样”是错误的,它在两者之间跳过了一个词。根据 OP,只能从左到右【参考方案3】:回答问题PHP array combination with out back order。有必要获取数组元素的所有可能组合并存储以下内容。
<?php
$alphabet = array('a','b','c');
$result = array();
$arrResult = array();
// recursively create all possible combinations
combine($alphabet, $result, $arrResult);
function combine($shiftedAlphabet, &$result, &$arrResult)
global $alphabet;
$currentElementStr = '';
$currentElementArr = array();
for($i = 0; $i < count($shiftedAlphabet); ++$i)
$newElement = $shiftedAlphabet[$i];
$currentElementStr .= $newElement;
$currentElementArr[] = $newElement;
if(!in_array($currentElementStr, $result)) // if not duplicated => push it to result
// find right position
$thisCount = count($currentElementArr);
$indexFrom = 0;
$indexToInsert = 0;
// find range of indexes with current count of elements
foreach ($arrResult as $arrResultKey => $arrResultValue)
$indexToInsert = $arrResultKey + 1;
if ($thisCount > count($arrResultValue))
$indexFrom = $indexToInsert;
if ($thisCount < count($arrResultValue))
--$indexToInsert;
break;
// find range of indexes with current count of elements
// find true index inside true range
$trueIndex = $indexToInsert;
$break = false;
for($j = $indexFrom; $j < $indexToInsert; ++$j)
$trueIndex = $j + 1;
foreach($arrResult[$j] as $key => $value)
if (array_search($value, $alphabet) > array_search($currentElementArr[$key], $alphabet))
$break = true;
break;
if($break)
--$trueIndex;
break;
// find true index inside true range
array_splice($result, $trueIndex, 0, $currentElementStr);
array_splice($arrResult, $trueIndex, 0, array($currentElementArr));
for($i = 0; $i < count($shiftedAlphabet) - 1; ++$i)
$tmpShiftedAlphabet = $shiftedAlphabet; // for combining all possible subcombinations
array_splice($tmpShiftedAlphabet, $i, 1);
combine($tmpShiftedAlphabet, $result, $arrResult);
// recursively create all possible combinations
var_dump($result);
?>
示例结果here
【讨论】:
以上是关于显示可能的字符串组合的主要内容,如果未能解决你的问题,请参考以下文章
python:随机播放字符串中的字符以获取所有可能的字符串组合[重复]