我遇到了一个我无法弄清楚的挑战,但对于那些在算法中思考的人来说,这似乎很有趣且相对容易......
如果我的搜索字词有"?"其中的字符,意味着它不应该关心前面的字符是否存在(如正则表达式)。但我希望我的程序打印出所有可能的结果。
一些例子:" tab?le"应该打印出来" table"和"故事"。结果的数量总是2到问号数量的幂。另一个例子:" carn?ati?on"应打印出来:
我正在寻找一个能带有问号的单词的函数,并输出一个包含所有结果的数组......
答案 0 :(得分:4)
按照“carn?ati?on”的例子:
您可以将单词/字符串拆分为“?”中的数组那么数组中每个字符串的最后一个字符将是可选字符:
[0] => carn
[1] => ati
[2] => on
然后,您可以为第一个数组中的每个元素创建两个单独的可能性(即,使用和不使用最后一个字符),并将这些排列映射到另一个数组。请注意,上述转换应忽略最后一个元素,因为它不适用。我会用它来形成:
[0] => [carn, car]
[1] => [ati, at]
[2] => [on]
然后我会迭代子数组中的每个元素来计算所有不同的组合。
如果您在申请此流程时遇到困难,请发表评论。
答案 1 :(得分:3)
我认为像这样的循环应该有效:
$to_process = array("carn?ati?on");
$results = array();
while($item = array_shift($to_process)) {
$pos = strpos($item,"?");
if( $pos === false) {
$results[] = $item;
}
elseif( $pos === 0) {
throw new Exception("A term (".$item.") cannot begin with ?");
}
else {
$to_process[] = substr($item,0,$pos).substr($item,$pos+1);
$to_process[] = substr($item,0,$pos-1).substr($item,$pos+1);
}
}
var_dump($results);