首先单独设置计算回文子串长度的函数。从中间向外围扩散找到左右不等时的边界就可求出回文子串的长度。
以A[0]为起点找回文串,直到A[len-2],共检查len-1次。
每次从A[i]开始是否存在回文子串时,分别判断奇数形式aba和偶数形式abba是否存在,取二者的大者为本轮找到的最大回文子串长度max。
用一个maxlen维护最大回文子串长度,并在一轮结束后确定是否更新。
外循环全部结束后返回。
int son(char* S, int left, int right){ while(left >= 0 && right < strlen(S)){ //left不过左界0,right不过右界len-1 if(S[left] == S[right]){ //左右相等时才同时向左向右移动下标 left--; right++; } else //左右不等时跳出while循环,结束查找,计算长度 break; } return right - left + 1 - 2; //用下标计算长度要-1,而最后左右边界不计入回文子串长度 } int getLongestPalindrome(char* A ) { int len = strlen(A); int maxlen = 0; //记录最大回文子串长度 if(len < 2) //0个元素,没有回文;1个元素,自己就是回文 return len; for(int i = 0; i < len-1; i++){ //i最大为len-2,因为i+1最大为len-1 int n = max(son(A, i, i), son(A, i, i+1)); //用n记录此轮找到的最大长度,也许并不是最终的最大长度 maxlen = max(maxlen, n); //这个才是要求的最大长度 } return maxlen; }