Php获得独特的独特输出

时间:2013-09-23 04:45:38

标签: php algorithm

我在这里遇到了这个算法的问题。

<?php
function get_all_substrings($input){
$subs = array();
$length = strlen($input);
for($i=0; $i<$length; $i++){
    for($j=$i; $j<$length; $j++){
        $subs[] = substr($input, $i, ($j - $i) + 1);    
    }   
}   
return $subs;
}

$subs = get_all_substrings("kikilala");
print_r($subs);

?>

它应该返回30个独特的结果,如下所示

 'a', 'al', 'ala', 'i', 'ik', 'iki', 'ikil', 'ikila', 'ikilal', 'ikilala', 'il', 'ila', 'ilal', 'ilala', 'k', 'ki', 'kik', 'kiki', 'kikil', 'kikila', 'kikilal', 'kikilala', 'kil', 'kila', 'kilal', 'kilala', 'l', 'la', 'lal', 'lala'

但我得到了

Array ( [0] => k [1] => ki [2] => kik [3] => kiki [4] => kikil [5] => kikila [6] => kikilal [7] => kikilala [8] => i [9] => ik [10] => iki [11] => ikil [12] => ikila [13] => ikilal [14] => ikilala [15] => k [16] => ki [17] => kil [18] => kila [19] => kilal [20] => kilala [21] => i [22] => il [23] => ila [24] => ilal [25] => ilala [26] => l [27] => la [28] => lal [29] => lala [30] => a [31] => al [32] => ala [33] => l [34] => la [35] => a )

我在哪里错了?感谢

6 个答案:

答案 0 :(得分:3)

这是因为一些子串是重复的。例如kialla等。要解决此问题,请运行array_unique

$subs = array_unique(get_all_substrings("kikilala"));

注意: array_unique不会重置索引。所以计算 - 数组长度 - 观察最后索引技巧在这里不起作用。要重置索引,请使用array_values

$subs = array_values(array_unique(get_all_substrings("kikilala")));

如果你想要它排序

$subs = array_unique(get_all_substrings("kikilala"));
sort($subs);

答案 1 :(得分:0)

如果你想要唯一,那么你需要检查子数组是否已经包含你要添加的条目。

例如,它会添加几个'k','i','l'和'a'字符。因此,当需要添加新条目时,您需要搜索子数组,只有在它不存在时才添加它。

答案 2 :(得分:0)

因为有些令牌是重复的。试试{$ 3}你的$ subs:

$subs = array_unique($subs);

答案 3 :(得分:0)

只需将这些行添加到您的代码中即可。

sort($subs);
$subs = array_unique($subs);

Codepad 上查看您想要的输出。

答案 4 :(得分:0)

你有循环的多个问题,如果我假设你的第一个/外部循环是字长,第二个/内部循环是字位置那么这里是错误

  1. 为什么以$ i = 0开头,它是无用的应该是1
  2. 如果你想要在子字符串中包含完整的单词,那么外部/长度循环必须包括全长,即$ i&lt; = $ length;
  3. 为什么内部/位置循环从$ j = $ i开始它应该是0
  4. substr位置参数中的
  5. 应为$ j,长度参数应为$ i
  6. 我还添加了一个额外的条件来过滤掉substr中未完成的选择,这会导致重复。最终代码在这里

        function get_all_substrings($input) {
          $subs = array();
          $length = strlen($input);
          for ($i=1; $i<=$length; $i++) {
            for ($j=0; $j<$length; $j++) {
              if ($length >= ($i + $j)) {
                $subs[] = substr($input, $j, $i);
              }
            }   
          }   
          return $subs;
        }
    
        $subs = get_all_substrings("kikilala");
        print_r($subs);
    

答案 5 :(得分:-1)

1 - (最后一个位置)字符串长度减少1

2 - 每次第一次循环减1

尝试:

<?php
function get_all_substrings($input){
    $subs = array();
    $length = strlen($input)-1; //change this line
    for($i=$length; $i>=0; $i--){ //and change this line
        for($j=$i; $j<$length; $j++){
            $subs[] = substr($input, $i, ($j - $i) + 1);    
        }   
    }   
    return $subs;
}

$subs = get_all_substrings("kikilala");
print_r($subs);

?>