首先写一个判断子串是否对称的函数
//判断子串是否对称
bool isSymmetrical(char *pbegin, char *pend)
{
if(!pbegin||!pend||pbegin>pend)
return false;
while(pbegin<pend)
{
if(*pbegin!=*pend)
return false;
pbegin++;
pend--;
}
return true;
}
很明显这种方法的时间复杂度会很高
int getLongest(char *pString)
{
if(!pString)
return 0;
int symmeticalLength=1; //始终保存当前已经找出的最长匹配序列的长度
char *pFirst=pString;
int length=strlen(pString);
while(pFirst<(pString+length-1))
{
char *pLast=pFirst+1;
while(pLast<(pString+length))
{
if(isSymmetrical(pFirst,pLast))
{
int newLength=pLast-pFirst+1;
if(newLength>symmeticalLength)
symmeticalLength=newLength;
}
pLast++;
}
pFirst++;
}
return symmeticalLength;
}
可以对这种方法进行优化
我们先判断子字符串A是不是对称的,如果不是对称的,则左右分别延长一个字符也不是对称的。
如果A对称,那么我们只需要判断左右一个字符是不是相等。
int getLongest2(char *pString)
{
if(!pString)
return 0;
int symmeticalLength=1;
char *pChar=pString;
while(*pChar!='\0')
{
//按照奇数位进行判断,例如aba
char *pFirst=pChar-1;
char *pLast=pChar+1;
while(pFirst>=pString&&*pLast!='\0'&&*pFirst==*pLast)
{
pFirst--;
pLast++;
}
int newLength=pLast-pFirst-1;
if(newLength>symmeticalLength)
symmeticalLength=newLength;
//按照偶数为进行判断,例如 abba
pFirst=pChar;
pLast=pChar+1;
while(pFirst>=pString&&*pLast!='\0'&&*pFirst==*pLast)
{
pFirst--;
pLast++;
}
newLength=pLast-pFirst-1;
if(newLength>symmeticalLength)
symmeticalLength=newLength;
pChar++;
}
return symmeticalLength;
}