(唯品会·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;
}
}
}