最長回文子串

2021-06-17 20:58:28 字數 1785 閱讀 6449

輸入乙個字元,求出其中最長的回文子串。子串的含義是:在元串中連續出現的字串片段。回文的含義是:正看和倒看相同,如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如下...