輸入乙個字元,求出其中最長的回文子串。子串的含義是:在元串中連續出現的字串片段。回文的含義是:正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串
如有多個,輸出,起始位置最靠左的
樣例輸入:confuciuss say:mandam,i ˊm adam.
樣例輸出:madam,i ˊm adam
1.輸入問題的解決
scanf("%s",s);已經不適合,因為它碰到空格或則tab鍵就會停下來,fgetc()函式讀入的是乙個個字元,而非完整的字串,所以在這裡採用fgets(buf,maxn,fin)
從流中讀一行或指定個字元,
原型是char *fgets(char *s, int n, file *stream);
從流中讀取n-1個字元,除非讀完一行,引數s是來接收字串,如果成功則返回s的指標,否則返回null。
形參注釋:*s結果資料的首位址;n-1:一次讀入資料塊的長度,其預設值為1k,即1024;stream檔案指標
char * fgets(char * s,int size,file * stream);
s,資料儲存位置;size,讀取字串的最大數量;stream,指向file結構的指標。
2 這個函式的精妙之處在於它所需要的預處理
在輸入完成後,必須要過濾掉,空格和其他的標點符號,所以這就需要提取出有用的字元,而去除那些無用的字元,通過這樣的操作,就能很好解決問題。
就拿剛才的題目中給的例子而言,我們去除空格和標點符號之後的字串為:confuciusssaymadamimadam主要目的就是這個字串中的字串的最大回文子串,這就很明顯了。
如下面簡易**所示
n=strlen(buf);
m=0;
for(i=0;iif(isalpha(buf[i])) s[m++]=toupper(buf[i]);
其中isalpha()函式是用來判斷是不是為大寫字母或則小寫字母,toupper()函式返回字元的大寫形狀,它們都在命名空間ctype.h中。
祥情見
工具的問題基本解決,那麼現在觸碰核心的回文子串的查詢方法.
1 常規方法
for(i=0;i
for(j=i;j
總的來看,這種方法求出的繪文字串太過於複雜 2
這種方法的核心思想為從第乙個開始當做回文子串的中間字母開始
向兩邊查詢,只要不符合情況就break
這種有兩種情況
1.adfda ad和da相對於f對稱
2.asddsa asd和dsa直接對稱
for(i=0;i
for(j=0;i-j>=0&&i+jmax)}
//直接對稱的情況
for(j=0;i-j>=0&&i+j+1max)}}
這種方法跳過了很多沒有必要的運算 所以其執行效率更高!
#include #include #include #define maxn 5000+10
char buf[maxn],s[maxn];
int p[maxn];
int main()
}for(j=0; i-j>=0&&i+j+1max)}}
for(i=x; i<=y; i++) //輸出從起點到終點;
printf("\n");
return 0;
}//confuciuss say:madam,i'm adam.
最長回文子串 最長回文子串行
1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...
最長回文子串
描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...
最長回文子串
最長回文子串也是筆試和面試環節經常出現的乙個題目,基本的思想很簡單,就是從頭開始,以每個點為中點位置,然後向兩邊搜尋最長的相等的串,有乙個需要注意的地方就是串的長度為偶數或者奇數時的不同情況,比如abba和aba這樣的不同的子串,需要同時考慮到這兩種情況,做了乙個簡單的實現,簡單測試過,code如下...