题目要求
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
(具体要求请看5. 最长回文子串)
解题思路
参考了各路大神的解题思路,就这种我感觉比较容易理解一点,所以就采用了中心扩展算法,等我再好好看看马拉车算法再和大家分享吧。
首先要了解回文的特点,它是关于中心对称的,这样的对称分为两种情况,一种的长度为奇数的字符串,一种是长度为偶数的字符串,根据这个特点,就可以分别比较中心两侧对应的字符,通过判断两侧对应字符是否相同来得出当前判断的子串是否为回文,代码如下:
代码
class Solution {
protected $len = 0; // 字符串长度
protected $start = 0; // 起始位置
protected $length = 0; // 截取长度
/**
* @param String $s
* @return String
*/
public function longestPalindrome($s) {
$this->len = strlen($s);
for ($i = 0; $i < $this->len; $i++) {
// 如果起始位置 + 截取长度 = 字符串长度,就不需要继续循环下去,因为可以确定当前长度是最长的
if ($this->start + $this->length >= $this->len) break;
$this->expandAroundCenter($s, $i, $i); // 情况 1: aba
$this->expandAroundCenter($s, $i, $i + 1); // 情况 2: bb
}
// 使用 substr 函数,截取相应的字符串
return substr($s, $this->start, $this->length);
}
/**
* @param String $str
* @param Integer $left
* @param Integer $right
*/
protected function expandAroundCenter($str, $left, $right) {
// 这里判断左右两边对应字符是否相等,如果相等,left-1,right+1,继续比较
while ($left >= 0 && $right < $this->len && $str[$left] === $str[$right]) {
$left--;
$right++;
}
// 当上面循环结束,也就是找到了一个回文子串
// temp 是子串的长度
$temp = $right - $left - 1;
// 与 length 比较,看当前找到的子串是否是较长的那个,
// 如果是,就给 start 和 length 赋值
if ($this->length < $temp) {
$this->start = $left + 1;
$this->length = $temp;
}
}
}
课程目录
1.讲师介绍 http协议 挖掘BUG.mp4
2.搭建apache php mysql.mp4
3.搭建域名.mp4
4.PHP变量 变量的引用.mp4
5.数据类型 字符串函数 常量 运算符 if判断 switch while.mp4
6.补上昨天运算符与优先级.mp4
7.for循环.mp4
8.函数.mp4
9.return 引用函数.mp4
10.数组.mp4
11.时间戳 系统变量 文件操作.mp4
12.GET跟POST请求.mp4
13.三元运算符.mp4
14.mysql数据库文件类型 创建数据库 创建表 字段.mp4
15.文件包含上.mp4
16.文件包含下.mp4
17.MYSQL所有操作.mp4
18.PHP操作数据库.mp4
19.补上数据类型,自增型,搜索关键字,分页.mp4
20.面向对象.mp4
21.session与cookie的原理.mp4
22.定义cookie cookie跨域.mp4
23.文件上传.mp4
24.可变变量.mp4
PHP编程.docx
编程.pptx
下载地址:百度云盘