package NC;
import java.util.Stack;
/**
* NC17 最长回文子串
*
* 对于一个字符串(仅包含小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。
*
* 给定字符串 A 以及它的长度 n ,请返回最长回文子串的长度。
*
* 数据范围:
* 要求:空间复杂度O(1) ,时间复杂度O(n^2)
* 本题存在空间复杂度O(n) ,时间复杂度O(n) 的解法
*
* @author Tang
* @date 2021/9/30
*/
public class GetLongestPalindrome {
char[] chars;
/**
* 与某个元素为中心向两边扩散
* @param index
* @return
*/
private int maxCount(int index) {
int count = 1;
int leftIndex = index - 1;
int rightIndex = index + 1;
//如果index两边与index值都相等的扩散规则
if(index > 0 && index < chars.length -1 && chars[index - 1] == chars[index] && chars[index+1] == chars[index]) {
leftIndex = index - 2;
rightIndex = index + 2;
count+=2;
}else if(index > 0 && chars[index] == chars[index - 1]) {
//如果index和右边相等的扩散规则
leftIndex = index - 2;
rightIndex = index + 1;
count++;
}else if(index < chars.length -1 && chars[index] == chars[index+1]) {
//如果index和左边相等的扩散规则
leftIndex = index - 1;
rightIndex = index + 2;
count++;
}
//扩散
while(leftIndex >= 0 && rightIndex <= chars.length - 1 && chars[leftIndex] == chars[rightIndex]) {
count+=2;
leftIndex --;
rightIndex++;
}
return count;
}
public int getLongestPalindrome(String A, int n) {
// write code here
chars = A.toCharArray();
int max = 0;
//算出以每个元素为中心的最长回文数
for(int i = 0; i < chars.length; i++) {
int count = maxCount(i);
max = Math.max(max, count);
}
return max;
}
public static void main(String[] args) {
String A = "ddbcdddccabbdcdbdbccdaabcdaaaabaadcbadaabdcbaccdabdbccacdddcdcaacdadbacbbccabdabdcddbaacbadacdadbaccbcaadddddddabddbabdaaacdddcd";
System.out.println(new GetLongestPalindrome().getLongestPalindrome(A,7));
}
}