NC17 最长回文子串

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));

}


}
posted @ 2021-09-30 17:23  六小扛把子  阅读(179)  评论(0编辑  收藏  举报