一、题目如下:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
题目要求给定字符串的最大对称子字符串,如“aaabccbacc”的最大对称子字符串为“abccba”。
二、思路:
以每个字符或两个字符的中间作为中心向两边比较过去,并判断是否为对称子字符。思路很简单,两种情况示意图如下:
图一、两种对称情况示意图
如图,对于对称字符串,可能出现如上两种情况。一种为A“偶对称”,以中隔线互相对称;另一种为B“奇对称”,以中间一字符为中心对称。通过i从0一直扫向字符串的尾部,每次前进0.5,并以i为中心,向两端扫去进行判断。时间复杂度为O(n^2),最坏情况为整个字符串所有字符相同,那么每次扫都得扫到尽头。
三、Java程序
</pre><pre name="code" class="java">public class Solution {
public String longestPalindrome(String s) {
int down = 0,up = 0,count = 0; //分别记录扫字符串时的上下区间及字符串长度
int sl = s.length();
int maxl = 0;
int subDown = 0, subUp = 0; //目标子字符串的上下区间
String subS = new String("");
if(sl==0)
return "";
//1. 找出目标子字符串的中间位置及上下限
for(double i=0; i<=sl-1; i=i+0.5)
{
down = (int)Math.floor(i);
up = (int)Math.ceil(i);
if((i%1==0.5)&&sl!=0) //判断i所属情况(A或B)
{
count = 0;
}else
{
count = 1;
down--;
up++;
}
//2. 以i为中心向两边扫描
while(!(down<0||up>sl-1))
{
if(s.charAt(down)!=(s.charAt(up)))
{
break; //2.1. 当以i为中心对称的俩字符不相等则跳出扫描
}else{ //2.2. 当以i为中心对称的俩字符相等则继续分别向两边移动
count+=2;
down--;
up++;
}
}
//3. 更新最长字符串
if(count>maxl)
{
maxl = count;
subDown = down;
subUp = up;
}
}
//3.1 由于在扫描时,先移动后再判断,停止时其实前后都多移动了一个单位,这里进行一个单位的恢复
subDown++;
subUp--;
subS = s.substring(subDown,subUp+1);
return subS;//返回对称子字符串
}
}
扩展学习:该文章介绍了几种方法Java Longest Palindromic Substring(最长回文字符串)