面试经典(21)--最大回文

本文探讨如何在给定字符串中找到最长的对称子字符串,并通过算法实现这一目标。详细介绍了对称子字符串的概念,以及如何使用双指针技巧进行搜索。此算法的时间复杂度为O(n^2),适用于字符串分析任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。

解法:pChar指向当前字符,比如第一个‘o',那么以pChar为中心向俩边判定。要分奇数偶数俩种情况,由于要遍历n个字符,且最多向两边扩展长度为n,所以复杂度O(n^2)。

int GetLongestSymmetricalLength_2(char* pString)
{
	if(pString == NULL)
		return 0;
	
	int symmeticalLength = 1;
	char* pChar = pString;
	while(*pChar != '\0')
	{
		// Substrings with odd length	
		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;
				
		// Substrings with even length	
		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、付费专栏及课程。

余额充值