在网上找了几个版本,改编的,好难啊。加油。
//最大回文子串问题
#include<iostream>
#include<string>
using namespace std;
//返回最长的回文子串
char *Max_SubString_bxy(char *str,int &length)
{
assert(str != NULL);
int n = strlen(str);
int len=n;
int x, y;
char *pri = new char[len];
char *res = new char[len];
while(n--)
{
int m=0;
int max = 0;
for(int i = 0; i < len; ++i)
{
if(isalpha(str[i])) //判断是否是字母
{
pri[m] = i;
res[m++] = toupper(str[i]); //字母转换为大写
}
}
for(int i = 0; i < m; ++i) //不预先判断奇偶,先奇后偶,max自动更新
{
for(int j = 0; i - j >= 0 && i + j < m; ++j) //最长回文字串为奇数
{
if(res[i - j] != res[i + j]) break; //向两边扩展,不相等跳出
if(j * 2 + 1 > max)
{
max = j * 2 + 1; //记录最长回文字串长度
x = pri[i - j]; //记录最长回文字串起点
y = pri[i + j]; //记录最长回文字串终点
}
}
for(int j = 0; i - j >= 0 && i + j < m; ++j) //最长回文字串为偶数
{
if(res[i - j] != res[i + j + 1]) break;
if(j * 2 + 2 > max)
{
max = j * 2 + 2;
x = pri[i - j];
y = pri[i + j + 1];
}
}
}
}
char *s = new char[100];
int c = 0;
for(int i=x; i<=y; i++)
{
s[c++] = str[i];
}
length = (y-x+1);
s[c]='\0';
return s;
}
//返回最长回文子串的长度
int LengthOfMaxSubString(char *str)
{
assert(str != NULL);
int n = strlen(str);
int len=n;
int max = 0;
char *res = new char[len];
while(n--)
{
int m=0;
for(int i = 0; i < len; ++i)
{
if(isalpha(str[i])) //判断是否是字母
{
res[m++] = toupper(str[i]); //字母转换为大写
}
}
for(int i = 0; i < m; ++i)
{
for(int j = i; j < m; ++j)
{
int ok = 1;
for(int k = i; k <= j; ++k)
{
if(res[k] != res[i + j - k])
{
ok = 0;
break;
}
}
if(ok && j - i + 1 > max)
{
max = j - i + 1;
}
}
}
}
return max;
}
int main()
{
char a[] = "ABCbawwwwa";
int num=0;
char *str = Max_SubString_bxy(a,num);
int len = LengthOfMaxSubString(a);
cout <<"源字符串:"<<a<<endl;
cout <<"最长的回文子串为:"<<str<<endl;
cout <<"长度为:"<<len << "没错,就是"<<num<<endl;
}