LeetCode5.最长回文子串
作者:互联网
LeetCode5.最长回文子串
题目描述
/**
* 给你一个字符串 s,找到 s 中最长的回文子串。
*/
思路分析
思路1.暴力遍历思路
- 第一次遍历字符串中所有字符
- 第二次遍历找到该字符对应所有子串
- 判断这些子串是否为回文数
- 如果是,记录最长子串并返回
- 暴力遍历时间复杂度太高,一般不采用
思路2 .中心扩展思路
- 因为回文串的每个字符是关于中心完全对称的
- 因此可以使用从中心字符向两边扩展的思路
- 如果每扩展一步左右两边的字符还相等,则继续扩展,否则结束扩展
- 中心对称也有两种,要不类似aba这种,关于一个字符对称,要么类似abba这种
- 依次遍历字符串的每个字符,使用中心扩展,拿到中心扩展后的回文子串
- 判断是否中心对称,如果中心对称,记录回文子串及其大小
- 比较最长回文子串的成绩,记录左右索引
源码及分析
public String longestPalindrome(String s) {
//暴力遍历思路
//1.第一次遍历字符串中所有字符
//2.第二次遍历找到该字符对应所有子串
//3.判断这些子串是否为回文数
//4.如果是,记录最长子串并返回
//5.暴力遍历时间复杂度太高,一般不采用
//中心扩展思路
//1. 因为回文串的每个字符是关于中心完全对称的
//2. 因此可以使用从中心字符向两边扩展的思路
//3. 如果每扩展一步左右两边的字符还相等,则继续扩展,否则结束扩展
//4. 中心对称也有两种,要不类似aba这种,关于一个字符对称,要么类似abba这种
//5. 依次遍历字符串的每个字符,使用中心扩展,
// 判断是否中心对称,如果中心对称,记录回文子串及其大小
//字符串校验,如果是空串,直接返回空
if (s == null || s.length() < 1) {
return "";
}
//定义两个变量保存要返回的最长回文子串的左右索引
int left = 0;
int right = 0;
//遍历这个字符串,判断每一个字符所中心扩展的回文子串长度
for (int i = 0; i < s.length(); i++) {
//第一种中心对称的情况
int len1 = centerExpanding(s, i, i);
//第二种中心对称的情况
int len2 = centerExpanding(s, i, i + 1);
//记录这两种中心扩展的最长回文子串的长度
int len = Math.max(len1, len2);
//如果新的回文子串的长度大于旧的回文子串的长度
//则重置要返回在最长回文子串的索引
if (len > (right - left)) {
//重置左侧索引
left = i - (len - 1) / 2;
//重置右侧索引
right = i + len / 2;
}
}
//返回最长回文子串
return s.substring(left, right + 1);
}
//编写中心扩展的方法
/**
* @param s 要判断的字符串
* @param left 回文子串左边的索引
* @param right 回文子串右边的索引
* @return 回文子串的长度
*/
public int centerExpanding(String s, int left, int right) {
//循环判断满足条件的最长回文子串的长度
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
return right - left - 1;
}
标签:子串,字符,LeetCode5,遍历,right,left,回文 来源: https://www.cnblogs.com/mx-info/p/14733881.html