面试之——求最长回文子串长度

最近太忙,好几天没巩固基础了。今天,求一个字符串你的最长回文子串。

思路:回文字符串就是说该字符串从前往后和从后往前的内容是一样的。
所以,可以用指针指向数组的某一元素,从该元素向后和向前遍历,如果一样则说明该子串是回文子串。
比如"abcdefe"中“efe”就是一个回文字符串。
当然“abba”中"abba"就是一个回文字符串。
所以说,回文字符串可以是单数,也可以是双数。

#include

int getHuiWenSubStr(char* str, int length)
{
	//入参判断
	if(!str || lenth < 1)	//字符串为空或者指针为nullptr时
	{
		return 0;
	}

	int maxLen = 0;		//存放最终结果:回文子串的长度
	int curSubStrLen = 0;	//存放当前指针遍历的过程中回文子串的长度
	
	//遍历整个字符串
	for(int i = 0; i < length; i++)
	{
		//当指针指向下标为i的元素时,定义j从0开始以i为中心向两边遍历子串;注意判断条件,下标要介于0~length-1之间。
		//注:此循环判断条件是当子串长度为奇数时,如“abcdefe”
		for(int j = 0; (i-j>=0)&&(i+j) < length; j++)
		{
			if(str[i-j] != str[i+j])	//如果i两边的元素不相同,则直接跳出循环。
			{
				break;
			}
			else			//如果i两边的元素相同,则根据j的大小可求出子串的长度。
			{
				curSubStrLen = 2*j + 1;
			}
		}
		if(curSubStrLen > maxLen)	//子串为奇数个时,求出该字符串的最大回文子串
		{
			maxLen = curSubStrLen;
		}
		//当指针指向下标为i的元素时,定义q从0开始以i和i+1为中心向两边遍历子串;注意判断条件,下标要介于0~length-1之间。
		//注:此循环判断条件是当子串长度为奇数时,如“abcdeffe”
		for(int q = 0; ((i-q)>=0)&&(i+q+1<length); q++)
		{
			if(str[i-q] != str[i+q+1])
			{
				break;
			}
			else	//else第一次是当i指向f的时候,q为0,cursubstrlen为2; q为1时,cursubstrlen为4
			{
				curSubStrLen = 2*q + 2;
			}
		}
		if(curSubStrLen > maxLen)
		{
			maxLen = curSubStrLen;
		}
	}
	return maxLen;			//返回维护的最大长度值
}

int main()
{
	char str[] = "abcdefe";
	const int length = strlen(str);	//strlen遇见结束符停止,length值为7
	
	std::cout << getHuiWenSubStr(str, length) << std::endl;
	std::cin.get();
	return 0;
}

这些小算法还是要多看多思考多写。

你可能感兴趣的:(#,算法:常见面试算法题,#,C++)