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