//例題3-4
/* * 輸入乙個字串,求出其中最長的回文子串。子串的含義是:在原串中連續出現的字串片段。
*回文的含義是:正看著和倒看著相同,如abba和yyxyy。在判斷時,應該忽略所有標點符號和空格
*且忽略大小寫,但輸出應保持原樣(在回文串的首部和尾部不要輸出多餘字元)。輸入字元長度不超過5000
*且佔據單獨的一行。應該輸出最長回文串,如果有多個,輸出起始位置最靠左的。
*樣例輸入:confuciuss say:madam,i'm adam.
*樣例輸出:madam,i'm adam
*///程式3-5 最長回文子串(1)
#include#include#include//用到isalpha、touuper等工具
#define maxn 5000+10
char buf[maxn],s[maxn];
int main()
printf("max=%d\n",max);
return 0;
}//程式3-5 最長回文子串(2)
#include#include#include//用到isalpha、touuper等工具
#define maxn 5000+10
char buf[maxn],s[maxn];
int p[maxn]; //增設陣列p,用於儲存s[i]在buf中的位置
int main()
//儲存當前最長回文子串長度,記錄子串範圍
}for(j=0;i-j>=0 && i+j+1max)
}} for(i=x;i<=y;i++) //把最長回文子串輸出
printf("%c",buf[i]);
printf("\n");
return 0;
}/*樣例輸入:confuciuss say:madam,i'm adam.
*樣例輸出:madam,i'm adam
*//分析得出最長回文子串的過程
*(1) for(i=0;i=0 && i+j=0表示i到j的距離不能上溢
//i+jmax) //因為子串的長度為奇數,所以子串的長度應該等於j*2+1(j為以i為中心,往兩邊的距離)
//儲存當前最長回文子串長度,記錄子串範圍
}*(3) for(j=0;i-j>=0 && i+j+1max)
}}*字串s="confuciusssaymadamimadam"
*字串長度m=24
*第乙個for迴圈迴圈到i=18的時候
*也就是遍歷到s[18]位置上,這時s[18]='i'
*接著進行內部迴圈,執行第二個迴圈體,開始以i為中心點,向兩邊擴充套件
*i=18,j=0,滿足條件,執行if語句,s[i-j]=i,s[i+j]=i,s[i-j]=s[i+j]不滿足條件
*執行下一條if語句,判斷j*2+1是否大於max,0*2+1max,max=7,p[i-j]=15,p[i+j]=21
*j=4;s[i-j]=a;s[i+j]=a;
*j*2+1>max,max=9,p[i-j]=14,p[i+j]=22
*j=5;s[i-j]=m;s[i+j]=m;
*j*2+1>max,max=11,p[i-j]=13,p[i+j]=23,x=13,y=23
*j=6;i+j>m,結束本次迴圈
*繼續執行下乙個for語句
*i=18,j=0,滿足迴圈條件,執行迴圈體
*s[i-j]!=s[i+j+1];滿足條件,break跳出迴圈
*到此最長的回文子串已經得出來了,不過還要繼續遍歷字串,直到結束為止
*最後結果:madam,i'm adam
*/
經典演算法 最長回文子串
時間限制 1000ms 單點時限 1000ms 記憶體限制 64mb 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一連串的字串,於是小hi 就向小ho 提出了那個經典的問題 小ho 你能不能分別在...
演算法競賽入門經典 C 入門
include 提供輸入輸出流 include 提供常用演算法 using namespace std const int maxn 100 10 int a maxn int main return0 宣告陣列時,陣列大小可以用const宣告的常數。在c 中,這樣的寫法更加推薦。include i...
演算法競賽入門經典 1
想著要學演算法已經很長時間了,但一直都是有問題自己想,很少受 正規軍 編排,網上關於演算法的書倒是不少,其一必推 演算法導論 還有一本 演算法競賽入門經典 作者劉汝佳,好了,步入正題,兩天時間從第一章到第三章結尾,算是對c又進行了一遍複習,說一下新得 3d 3d 03d 知道它們的區別嗎,在呼叫pr...