1 #include2 using namespace std; 3 4 void substring(char* str) 5 { 6 int len = strlen(str); 7 len = 2*len + 1; 8 for(int i = len; i >= 1; i--) 9 {10 if(i%2 == 0)11 str[i-1] = str[i/2-1];12 else13 str[i-1] = '#';14 }15 str[len] = '\0';16 int* p = new int[len]; //p[i]用来保存第i个字符为中心的回文字串向右/向左扩张的距离17 int mx = 0; //表示已经处理的回文字串向右扩张的最长距离18 int id = 0; //表示上述回文子串的中间位置19 memset(p,0,len);20 for(int i = 0; i < len; i++)21 {22 if(mx - i > 0)23 {24 p[i] = p[2*id - i] < (mx - i)?p[2*id - i]:(mx-i);25 }26 else27 p[i] = 1;28 while(str[i + p[i]] == str[i - p[i]]) p[i]++;29 if(p[i] > mx - i)30 {31 mx = i + p[i];32 id = i;33 }34 }35 mx = 0;36 id = 0;37 for(int i = 0; i < len; i++)38 {39 if(p[i] > mx)40 {41 mx = p[i];42 id = i;43 }44 }45 cout<<"最长回文字串:";46 for(int i = id-mx+1; i < id+mx; i++)47 {48 if(str[i] != '#')49 cout< >str;62 substring(str);63 delete[] str;64 str = NULL;65 }66 return 0;67 }