您的位置:首页 > 其它

对称子串的最大长度

2013-04-10 12:44 113 查看
首先写一个判断子串是否对称的函数

//判断子串是否对称
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: