给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
方法一:暴力法
应该是第一眼就想出来的方法了 逻辑也符合一般思想(最简单- -)
function isPalindrome($str)
{
if ($str === strrev($str)) {
return 1;
} else {
return 0;
}
}
function getAllSubstring($str)
{
$all_str_arr = [];
for ($i = 0; $i < strlen($str); $i++) {
for ($j = 0; $j < strlen($str) - $i + 1; $j++) {
if (strlen(substr($str, $i, $j)) > 1) {
$all_str_arr[] = substr($str, $i, $j);
}
}
}
return $all_str_arr;
}
function getArrMaxStr($arr)
{
$max = 0;
foreach ($arr as $k => $v) {
if (strlen($arr[$max]) < strlen($v)) {
$max = $k;
}
}
return $arr[$max];
}
function getMaxPalindrome1($str)
{
if (isPalindrome($str)) {
return $str;
} else {
// 拆分成多个字符串,然后循环比较
foreach (getAllSubstring($str) as $k => $v) {
if (isPalindrome($v)) {
$max_str[] = $v;
}
}
return getArrMaxStr($max_str);
}
}
echo getMaxPalindrome1('aoifbnruhgohajfkasdjfjdfurivb');
显然这种方法的时间复杂度是O(n^3)
优化:在获取所有子串的方法中直接判断 返回的是全部回文子串的数组 时间复杂度优化到O(n^2)
方法二: