得到一个字符串中的所有回文

时间:2017-09-19 11:40:59

标签: php

我被要求在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这样的字符串,因为我应该得到最长的回文。

1 个答案:

答案 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;
  }
}

希望这会有所帮助。