#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXSIZE 5000
/*void Paliandrome(char*);
int main()
{
char lpStr[] = "aaaMadam,I'm Adamzsd";
printf("源字符串: %s\n",lpStr);
Paliandrome(lpStr);
return 0;
}
void Paliandrome(char lpStr[])
{
char lpBuf[MAXSIZE];
int iPos[MAXSIZE];
int iLen = strlen(lpStr);
int j = 0;
for(int i = 0; i < iLen; i++)
if(isalpha(lpStr[i]))
{
lpBuf[j] = toupper(lpStr[i]);
iPos[j++] = i;
}
lpBuf[j] = '\0';
printf("转换字符串: %s\n",lpBuf);
iLen = strlen(lpBuf);
int MAXLEN = 0;
int iX,iY; //原来字符串的位置
for(i = 0; i < iLen; i=i+1)
{
for(j = i; j < iLen; j=j+1)
{
bool OK = true;
for(int t = i; t < j; t++)
{
if(lpBuf[t] != lpBuf[i+j-t])
OK = false;
}
if(OK != false && MAXLEN < j-i+1)
{
iX = iPos[i];
iY = iPos[j];
MAXLEN = j-i+1;
}
}
}
printf("最长回文子串: ");
for(i = iX; i <= iY; i=i+1)
printf("%c",lpStr[i]);
printf("\n长度为: %d\n",MAXLEN);
return;
}
*/
/*
上面这种方法效率太低,当5000个a的时候这么枚举就太浪费时间了
我们可以枚举回文串的中间位置
注意:当字符串的长度为奇数和偶数的处理是不同的
*/
void Paliandrome(char*);
int main()
{
char lpStr[] = "aaaMadam,I'm Adamzsd";
printf("源字符串: %s\n",lpStr);
Paliandrome(lpStr);
return 0;
return 0;
}
void Paliandrome(char lpStr[])
{
char lpBuf[MAXSIZE];
int iPos[MAXSIZE];
int iLen = strlen(lpStr);
int j = 0;
for(int i = 0; i < iLen; i++)
if(isalpha(lpStr[i]))
{
lpBuf[j] = toupper(lpStr[i]);
iPos[j++] = i;
}
lpBuf[j] = '\0';
printf("转换字符串: %s\n",lpBuf);
iLen = strlen(lpBuf);
int MAXLEN = 0;
int iX,iY; //原来字符串的位置
for(i = 0; i < iLen; i++)
{
for(j = 0; i-j>=0 && i+j<=iLen; j++)
{
//处理iLen为奇数的情况
if(lpBuf[i-j] != lpBuf[i+j])break;
if(j*2+1 > MAXLEN)
{
MAXLEN = j*2+1;
iX = iPos[i-j];
iY = iPos[i+j];
}
}
for(j = 0; i-j>=0 && i+j+1<=iLen; j++)
{
//处理iLen为偶数的情况
if(lpBuf[i-j] != lpBuf[i+j+1])break;
if(j*2+1 > MAXLEN)
{
MAXLEN = j*2+2;
iX = iPos[i-j];
iY = iPos[i+j+1];
}
}
}
printf("最长回文子串: ");
for(i = iX; i <= iY; i=i+1)
printf("%c",lpStr[i]);
printf("\n长度为: %d\n",MAXLEN);
return;
}
原样输出最长回文子串
最新推荐文章于 2022-09-16 00:26:26 发布