0

嗨,我有这个算法的问题。

<?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 )

我在哪里错了?谢谢

4

6 回答 6

3

那是因为某些子字符串是重复的。例如ki,等等。要解决这个问题,只需al运行。laarray_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);
于 2013-09-23T04:56:41.767 回答
0

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

  1. 为什么以$i=0开头,没用的应该是1
  2. 如果您希望子字符串中包含完整的单词,则外部/长度循环必须包含完整长度,即 $i<=$length;
  3. 为什么从 $j=$i 开始的内部/位置循环应该是 0
  4. 在 substr 位置参数应该是 $j 和长度参数应该是 $i

我还添加了一个额外的条件来过滤掉 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);
于 2013-09-23T05:17:41.280 回答
0

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

例如,它将添加几个“k”、“i”、“l”和“a”字符。因此,当需要添加新条目时,您需要搜索 subs 数组并仅在它不存在时添加它。

于 2013-09-23T04:55:21.290 回答
0

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

$subs = array_unique($subs);
于 2013-09-23T04:56:19.877 回答
0

只需将这些行添加到您的代码中..

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

在Codepad上查看您想要的输出。

于 2013-09-23T04:56:40.073 回答
-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);

?>
于 2013-09-23T04:56:55.577 回答