引言
字符串回文是C/C++面试中常见的问题之一,该内容主要考察面试者对于代码设计的鲁棒性、时间复杂度和空间复杂度的考虑,同时需要对代码的异常做和是判断,想要实现相关的代码不难,但是想要设计出鲁棒性较好的代码,需要花费一定的形式
示例需求描述
对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。
代码设计思路:通过回文字符串的特性,正反读取都相同,可以将字符串逆转后,求取最长公共子串,但可能会出现其他部分重置与另一部分相同,所以需要对比找到最长公共子串的索引与原索引相加是否为字符串长度-1,即当A.at(right+1)==A.at(left-1)时,maxLen=right-left+1;
测试用例:
示例1
输入:
"ababc"
返回值:
3
说明:
最长的回文子串为"aba"与"bab",长度都为3
示例2
输入:
"abbba"
返回值:
5
示例3
输入:
"b" 返回值:1
示例代码:
intgetLongestPalindrome(stringA,intn){//边界条件判断if(n2)returnA.length();//maxLen表示最长回文串的长度intmaxLen=0;for(inti=0;in;){//如果剩余子串长度小于目前查找到的最长回文子串的长度,直接终止循环//(因为即使他是回文子串,也不是最长的,所以直接终止循环,不再判断)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;}
购买专栏解锁剩余21%