题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
解题思路
基本思路就是在字符串的两头设置 i 和 j 两个指针,外循环是 j - - ,内循环是 i + +,即每次将 i 指向的字符与 j 指向的字符比较, 若不同,则 i 向右移动一个字符继续比较 , 直到 i 和 j 指向的字符相同的情况下,开始比较 i 和 j 中间的子串是否为回文,若是回文则记录这个回文子串的起点、终点与长度,用于和后面的子串进行对比得出最长回文子串。
看了文字解析还是不懂的话
上图:
由于本人实在辣鸡,套了两个循环,只考虑到内存空间的消耗,但并未考虑到时间复杂度
代码
public static String longestPalindrome(String s) {
int lengths = s.length();
if (lengths < 2) {
return s;
}
char[] chars = s.toCharArray();
int o = 0,t = 0; //用来记录字串的起点与终点;
int m = 0, n = 0; //暂存
int maxo = 0,maxt = 0;//用来记录最长子串的起点与终点;
int maxlenth = 0;//用来记录最长子串的长度;
int j = chars.length-1; //坐标二用来比较,在末尾
for (;j>=0;j--){
for (int i = 0;i<j;i++){
if (chars[i]==chars[j]){
o = i;
t = j;
m=i;
n=j;
int flag=1; //0为不是子串,1为正常标记
for (;m<n;m++,n--){
if (chars[m]!=chars[n]){
flag = 0;
}else {}
}
if (flag != 0 && (t-o+1)>maxlenth){
maxo = o;
maxt = t;
maxlenth = (t-o+1);
}
}else if (chars[i]!=chars[j])
{}//不做操作
}
}
return s.substring(maxo,maxt+1);
最后附上题源:
5. 最长回文子串