您的位置:首页 > 职场人生

每天一道面试题(四)

2013-11-04 10:37 211 查看
(唯品会·2014南京)给定字符串,可以通过插入字符,使其变成回文,求最少插入字符的数量。例如:ab最少插入1个字符,变为bab;aa最少插入0个字符;abcd最少插入3个字符,dcbabcd。

分析:首尾指针法——设两个指针pBegin和pEnd分别指向字符串的首尾,比较首尾指针指向的值,这时会有种情况:

1)*pBegin==*pEnd 则二者均向中间移动,即pBegin++;pEnd--;

2)*pBegin!=*pEnd,则有两种处理方法:一、在pEnd后插入和*pBegin相等的字符,然后pBegin++继续比较,统计剩余字符插入数量;二、在pBegin钱插入和*pEnd相等的字符,然后pEnd--继续比较,统计剩余字符插入数量。最少插入字符的数量即为一和二两种情况的最小者。

重复上面的过程,直到pBegin和pEnd相遇。

代码:

int minChange(char *str,char *pBegin,char *pEnd)
{
	if (str==NULL||pBegin==NULL||pEnd==NULL)
	{
		return -1;
	}
	else if (*str=='\0'||pBegin>=pEnd)
	{
		return 0;
	}
	else
	{
		//*pBegin==*pEnd 则二者均向中间移动,即pBegin++;pEnd--;
		while (pBegin<pEnd&&*pBegin==*pEnd)
		{
			pBegin++;
			pEnd--;
		}
		//*pBegin!=*pEnd,判断是在pBegin前插入还是在pEnd后插入
		if (pBegin<pEnd)
		{
			int min1=minChange(str,pBegin,pEnd-1);
			int min2=minChange(str,pBegin+1,pEnd);
			return min1<min2?min1+1:min2+1;
		}else
		{
			return 0;
		}
		
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: