最長回文子串

2021-06-14 15:10:09 字數 1779 閱讀 8603

**:描述

輸入乙個字串,求出其中最長的回文子串。子串的含義是:在原串連續出現的字串片段。回文的含義是:正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出(首尾不要輸出多餘的字串)。輸入字串長度大於等於1小於等於5000,且單獨佔一行(如果有多組答案,輸出第一組)。

輸入輸入乙個測試資料n(1<=n<=10);

隨後有n行,每行有乙個字串。

輸出輸出所要求的回文子串。

樣例輸入

1confuciuss say:madam,i'm adam.

樣例輸出

madam,i'm adam

解題思路:

1.輸入字串buf(gets輸入,可能有空格),pri陣列記錄字母的位置後用res陣列記錄經過大寫轉換後的字母。

2.從第i個元素開始遍歷,分為兩種情況:

回文字串為奇數時,從第i個向左(i-j)向右(i+j)遍歷,不相等則跳出。遍歷後max記錄此次遍歷的最大長度,並用x,y記錄起點和終點。

回文字串為偶數時,從第i個向左(i-j)向右(i+j+1)遍歷,不相等則跳出。

遍歷後max記錄此次遍歷的最大長度,並用x,y記錄起點和終點。

3.比較回文字串為奇數和偶數時的最大長度。(下面**只用max,若偶數大,則更新為偶數的最大值。否則,還是奇數的最大值)

4.用記錄最大長度的起點和終點輸出最長回文字串。

**如下:

[cpp]view plain

copy

#include

#include

#include

#include

#include

#include

using

namespace

std;  

char

buf[5005], res[5005], pri[5005]; 

//buf輸入,res記錄buf中字母並轉換成大寫,pri記錄res中字母在buf中位置

intmain()  

}  for(i = 0; i < m; ++i) 

//不預先判斷奇偶,先奇後偶,max自動更新

}  for(j = 0; i - j >= 0 && i + j < m; ++j) 

//最長回文字串為偶數

}  }  for

(i = x; i <= y; ++i) 

//x,y為起點,終點

printf("\n"

);  

}  return

0;  

}  

求回文字串的最大長度**如下:

[cpp]view plain

copy

#include

#include

#include

#include

#include

#include

using

namespace

std;  

char

buf[5005], res[5005];  

intmain()  

}  for(i = 0; i < m; ++i)  

}     

if(ok && j - i + 1 > max) max = j - i + 1;  

}  }  

cout<}  

return

0;  

}  

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...

最長回文子串

最長回文子串也是筆試和面試環節經常出現的乙個題目,基本的思想很簡單,就是從頭開始,以每個點為中點位置,然後向兩邊搜尋最長的相等的串,有乙個需要注意的地方就是串的長度為偶數或者奇數時的不同情況,比如abba和aba這樣的不同的子串,需要同時考慮到這兩種情況,做了乙個簡單的實現,簡單測試過,code如下...