我在这里遇到了这个算法的问题。
<?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 )
我在哪里错了?感谢
答案 0 :(得分:3)
这是因为一些子串是重复的。例如ki
,al
,la
等。要解决此问题,请运行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)
答案 4 :(得分:0)
你有循环的多个问题,如果我假设你的第一个/外部循环是字长,第二个/内部循环是字位置那么这里是错误
我还添加了一个额外的条件来过滤掉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);
?>