对称子串的最大长度

首先写一个判断子串是否对称的函数

//判断子串是否对称
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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值