繁体   English   中英

Php获得独特的独特输出

[英]Php getting unique distinct output

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

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

我在哪里错了? 谢谢

那是因为一些子串是重复的。 例如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);

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

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

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

$subs = array_unique($subs);

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

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

Codepad上查看所需的输出。

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

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

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

?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM