大致過程爲:先預處理,將非字母字符去掉,並將所有大寫字母轉爲小寫字母;然後從第二個字符開始作爲中間元素查找最長的迴文,並記錄最長的長度和位置;
難點是:輸出爲原輸入字符串的子串,這裏用的方法和作者的一樣,用數組p[]記錄預處理後的每個字符在原字符串的位置。
代碼如下:
//2014年6月24日23:16:08
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int p[5000+10];
int main()
{
freopen("huiwen.in","r",stdin);
// freopen("huiwen.out","w",stdout);
string inputStr;
string midStr;
string resultStr = "";
int resultLength = 1;
int st = 0,en = 0;
getline(cin,inputStr);
int i = 0;
for(string::size_type it=1 ; it<=inputStr.size() ; it++){
if(inputStr[it]>='a' && inputStr[it]<='z'){
midStr.push_back(inputStr[it]);
p[i++] = it;
}
else if(inputStr[it]>='A' && inputStr[it]<='Z'){
midStr.push_back(tolower(inputStr[it]));
p[i++] = it;
}
}
for(string::size_type it=1 ; it<=midStr.size() ; it++){
// cout << inputStr[it] ;
string::size_type i = 1;
string::size_type mid = it;
if(midStr[mid]==midStr[mid-1]){
while(mid-1-i>=0 && mid+i<midStr.size() && midStr[mid-1-i]==midStr[mid+i]){
i++;
}
i--;
if(2*i > resultLength){
resultLength = 2 * i;
st = mid - 1 - i;
en = mid + i;
// resultStr = midStr.substr(mid-1-i,2*i);
// cout << endl << resultStr << endl;
}
}
//aba
i = 1;
if(midStr[mid-1]==midStr[mid+1]){
while(mid-i>=0 && mid+i<midStr.size() && midStr[mid+i]==midStr[mid-i]){
i++;
}
i--;
if(2*i+1 > resultLength){
resultLength = 2*i+1;
st = mid - i;
en = mid + i;
// cout << endl << resultStr << endl;
}
}
}
// cout << st << " " << en << endl;
for(string::size_type it=p[st] ; it<=p[en] ; it++){
cout << inputStr[it];
}
cout << endl;
return 0;
}