首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

软件工程师笔试题-【最大回文子串】

2012-10-13 
程序员笔试题---【最大回文子串】最大的回文字串,相信大家都很熟悉了,类的题目有过很多。单纯的有求解字符串

程序员笔试题---【最大回文子串】

最大的回文字串,相信大家都很熟悉了,类似的题目有过很多。

单纯的有求解字符串中的最大回文字串,例如:“abcgoogleaba”,最大的回文字串为goog,虽说aba也是回文但长度较短。

还有网易游戏考到的一道题:“abcgoogleaba”,如果是回文的话,当做一个整体输出,否则单个的输出,这个输出的格式为:a,b,c,goog,l,e,aba.

针对求最大的回文字串问题。有很多种方式,比如蛮力法。但是相信大家在笔试或者面试的时候,考官都会要求尽量的好的时间和空间复杂度。

因此我们需要寻找更好的办法。

第一、最大的回文字串1、一般的做法,分为回文串是偶数个还是奇数个

就如上面的例子一样:abcgoogleaba,两个回文,一个是goog,另一个是:aba


2、将偶数个奇数个统一起来

如何统一,这是个问题?

我们可以这样,在每个字符之间插入一个特殊的字符。

比如上面的字符串:abcgoogleaba。可以进行这样的操作:#a#b#c#g#o#o#g#l#e#a#b#a#

这样回文的字串就都是奇数的情况,就不需要考虑偶数的情况。

3、上面的做法的时间复杂度依然不是很理想的

下面我们用更好的点做法O(n)

int getMaxHuiWenCharP(char *s,int len){int nLen=2*len+3;char *str =new char[nLen];int i=0;int max=0;str[0]='$';str[1]='#';for(;i<len;i++){str[i*2+2]=s[i];str[i*2+3]='#';}str[nLen-1]=0;int *p=new int[nLen];//定义一个用于标记的int数组for(i=1;i<nLen;i++){cout<<str[i];p[i]=0;}cout<<endl;int id=0;for(i=1; i<nLen; i++)    {        if( max > i )            p[i] = MIN( p[2*id-i], p[id]+id-i );//这里定义一个MIN的宏        else            p[i] = 1;        for(; str[i+p[i]] == str[i-p[i]]; p[i]++)            NULL;        if( p[i] + i > max )        {            max = p[i] + i;            id = i;        }    }int mx=0;for(i=1;i<nLen;i++){if(mx<p[i]-1)mx=p[i]-1;}return mx;}

第二、网易游戏笔试题

根据上面提供的方式,大家先柔和下咯!

欢迎大家t提供更好的办法哈!

热点排行