题目描述
给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最长回文子串为abba。
中心法求最长回文子串
还有一个更简单的方法可以使用O(N^2)时间、不需要额外的空间求最长回文子串。我们知道回文字符串是以字符串中心对称的,如abba以及aba等。一个更好的办法是从中间开始判断,因为回文字符串以字符串中心对称。一个长度为N的字符串可能的对称中心有2N-1个,至于这里为什么是2N-1而不是N个,是因为可能对称的点可能是两个字符之间,比如abba的对称点就是第一个字母b和第二个字母b的中间。因此可以依次对2N-1个中心点进行判断,求出最长的回文字符串即可。根据该思路可以写出下面的代码。
- package edu.pku.ss.hlj;
-
- public class LongestPalindrome {
- public static void main(String[] args) {
- String str = "abcddcc";
-
- String result = getPalindrome(str);
- System.out.println(result);
-
- }
-
-
-
-
-
-
-
-
-
- public static String getEvery(char[] ch, int i, int j) {
- int length = ch.length;
- while (i >= 0 && j <= length - 1 && ch[i] == ch[j]) {
- i--;
- j++;
- }
- return String.valueOf(ch).substring(i + 1, j);
-
- }
-
-
-
-
-
-
-
- public static String getPalindrome(String s) {
- char[] ch = s.toCharArray();
- String str = " ";
- String re = "";
- for (int i = 0; i < ch.length; i++) {
- re = getEvery(ch, i, i);
- if (re.length() > str.length()) {
- str = re;
- }
- re = getEvery(ch, i, i + 1);
- if (re.length() > str.length()) {
- str = re;
- }
- }
- return str;
- }
- }