我被要求在php中编写一个程序,其中需要打印给定字符串中所有出现的回文。
示例:对于字符串I O M K I L O I I T T C J I O P L L P O
答案是:
O P L L P O和 K I L O L I K
在执行此操作时,请记住,每个长度超过3个字符的回文都可以分解为更多的回文,但您只需要为每个回合打印出最长的尺寸(因此,对于示例字符串,您不应该打印LOL,LL,PLLP和ILOLI)
我尝试过但只能设法做到这一点:
[[ 0.15941701 0.84058299]
[ 0.12190033 0.87809967]
[ 0.06293788 0.93706212]
...
[ 0.93175738 0.06824262]]
<class 'numpy.ndarray'>
这给了我以下输出:
$data = 'I O M K I L O L I K T C J I O P L L P O';
$data = str_replace(' ', '', $data);
$palindromes = [];
for($i=0; $i<strlen($data); $i++ ) {
for($j=3; $j<=(strlen($data)-$i); $j++){
$word = substr($data, $i, $j);
$reverse_word = strrev($word);
if($word == $reverse_word){
print "Word: ".$word."<br/>";
}
}
}
这不是预期的输出。我应该摆脱像ILOLI,LOL PLLP这样的字符串,因为我应该得到最长的回文。
答案 0 :(得分:0)
根据你的例子,你提到答案是O P L L P O(六个字符长)和K I L O L I K(七个字符长),但是后来你暗示只返回最长的回文?
假设您的意思是后一种情况,您可以先将所有回文分配到数组,然后对数组进行排序,如下所示:
function str_length_sort($first, $second) {
return strlen($second) - strlen($first);
}
$data = 'I O M K I L O L I K T C J I O P L L P O';
$data = str_replace(' ', '', $data);
$palindromes = [];
for($i=0; $i<strlen($data); $i++ ) {
for($j=3; $j<=(strlen($data)-$i); $j++){
$word = substr($data, $i, $j);
$reverse_word = strrev($word);
if($word == $reverse_word){
$palindromes[] = $word;
}
}
}
usort($palindromes, 'str_length_sort');
$max = strlen($palindromes[0]);
foreach ($palindromes as $p) {
$length = strlen($p);
if ($length >= $max) {
echo $p;
}
}
希望这会有所帮助。