1 #include<iostream> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 6 char s[1000]; 7 char s_new[2000]; 8 int p[2000]; 9 10 int Init() 11 { 12 int len = strlen(s); 13 s_new[0] = '$'; 14 s_new[1] = '#'; 15 int j = 2; 16 17 for (int i = 0; i < len; i++) 18 { 19 s_new[j++] = s[i]; 20 s_new[j++] = '#'; 21 } 22 23 s_new[j] = '\0'; //別忘了哦 24 25 return j; //返回s_new的長度 26 } 27 28 int Manacher() 29 { 30 int len = Init(); //取得新字符串長度並完成向s_new的轉換 31 int maxLen = -1; //最長迴文長度 32 33 int id; 34 int mx = 0; 35 36 for (int i = 1; i < len; i++) 37 { 38 if (i < mx) 39 p[i] = min(p[2 * id - i], mx - i); //需搞清楚上面那張圖含義, mx和2*id-i的含義 40 else 41 p[i] = 1; 42 43 while (s_new[i - p[i]] == s_new[i + p[i]]) //不需邊界判斷,由於左有'$',右有'\0' 44 p[i]++; 45 46 //咱們每走一步i,都要和mx比較,咱們但願mx儘量的遠,這樣才能更有機會執行if (i < mx)這句代碼,從而提升效率 47 if (mx < i + p[i]) 48 { 49 id = i; 50 mx = i + p[i]; 51 } 52 53 maxLen = max(maxLen, p[i] - 1); 54 } 55 56 return maxLen; 57 } 58 59 int main() 60 { 61 while (printf("請輸入字符串:\n")) 62 { 63 scanf("%s", s); 64 printf("最長迴文長度爲 %d\n\n", Manacher()); 65 } 66 67 return 0; 68 }