您的位置:首页 > 其它

leetcode:最长回文子串

2019-07-06 15:48 267 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_42451640/article/details/94863946

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

思路
1.最长回文串可能是奇数或者偶数长度
2.奇数长度的特点是:扫描当前字符的前一个和后一个字符如果相等,依次向2边蔓延开继续判断。
3.偶数长度的特点是:先扫描到2个相邻相同的字符作为判断的开始,依次向2边蔓延开继续判断。
4.边界问题:空字符串或者字符串长度为1返回字符串本身,初始化最长回文串为字符串的第一个字符

class Solution {
public String longestPalindrome(String s) {
if (s.length()==0||s.length()==1){
return s;
}

int maxIndex = 0;
int maxLength = 1;
if (s.charAt(0)==s.charAt(1)){
maxLength=2;
}
boolean flag;   //标记是奇数还是偶数回文串
for (int i = 1; i < s.length() - 1; i++) {
//            偶数长度的回文串
if (s.charAt(i) == s.charAt(i + 1)) {
int strLength = 2;
int strIndex = i;
int j = i - 1;
int k = i + 2;
while (j >= 0 && k <= s.length() - 1) {
if (s.charAt(j) == s.charAt(k)) {
strLength += 2;
j--;
k++;
} else {
break;
}
}
if (strLength > maxLength) {
maxIndex = strIndex - strLength / 2 + 1;
maxLength = strLength;
flag = true;
}
}
//            奇数回文串
if (s.charAt(i - 1) == s.charAt(i + 1)) {
int strLength = 3;
int strIndex = i;
int j = i - 2;
int k = i + 2;
while (j>=0&&k<=s.length()-1){
if (s.charAt(j)==s.charAt(k)){
strLength+=2;
j--;
k++;
}else{
break;
}
}
if (strLength > maxLength) {
maxIndex = strIndex - strLength / 2 ;
maxLength = strLength;
flag = false;
}
}
}

return s.substring(maxIndex, maxIndex + maxLength);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: