本文我们主要解决C/C++回文问题:对于一个字符串,设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。
比如:输入字符串"asdfgfdsa",我们计算出其最大回文长度为14.具体的代码及其注释如下:
intgetLongestPalindrome(StringA,intn){
//边界条件判断
if(n2)
returnA.length();//在输入字符串小于2的时候,也就是字符串本身就是回文,直接返回
//maxLen表示最长回文串的长度
intmaxLen=0;
for(inti=0;in;i++){
//如果剩余子串长度小于目前查找到的最长回文子串的长度,直接终止循环
//(因为即使他是回文子串,也不是最长的,所以直接终止循环,不再判断)
if(n-i=maxLen/2)
break;
intleft=i;
intright=i;
while(rightn-1A.at(right+1)==A.at(right))
++right;//过滤掉重复的
//下次在判断的时候从重复的下一个字符开始判断
i=right+1;
//然后往两边判断,找出回文子串的长度
while(rightn-1left0A.at(right+1)
==A.at(left-1))
{
++right;
--left;
}
//保留最长的
if(right-left+1maxLen){
maxLen=right-left+1;
}
}
//截取回文子串
returnmaxLen;
}
代码设计思路:对于该问题,如果所给出的字符串为空或者只有一个字符,那么该字符串的回文就是其本身,长度也是其本身的长度。
当字符串的个数大于等于2时,这个时候就需要根据实际条件求回文字符串最大长度了;我们定义一个整型变量maxlen并初始化为0表示回文的最大长度,当输入的字符串中有一个回文字符子串大学当前的maxlen时,则输入最大回文长度maxlen更新为当前的回文子串长度。
同时,通过定义整型变量right和left变量,初始化为零,其中的right变量不断往右移动,left往左移动,同时不断判断字符串在left和right的位置,如果字符串A在right+1的位置和left-1的位置对应值相等,也就是A.at(right+1)==A.at(left-1),则表示满足回文需求,right和left继续往相反方向移动,直至两者值不一样或者移动到头尾为止。
这里需要注意的一种情况是:如果声誉子串长度小于目前查找的最长回文子串的长度时,直接终止循环,因为即便这个时候剩下的字符串都是回文,其长度也是小于当前查找到的最长子串的。
代码示例本次内容就分享到这里,希望大家喜欢。送人玫瑰,手有余香,期待您的点赞