原样输出最长回文子串

来源:互联网 发布:营销型企业网站源码 编辑:程序博客网 时间:2024/06/05 10:07
#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;}