题目链接:http://codeup.cn/problem.php?cid=100000629&pid=0
题目描述
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同。如abba和yyxyy。在判断回文时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。输入字符串长度不超过5000,且占据单独的一行。应该输出最长的回文串,如果有多个,输出起始位置最靠左的。
输入
一行字符串,字符串长度不超过5000。
输出
字符串中的最长回文子串。
样例输入
Confuciuss say:Madam,I’m Adam.
样例输出
Madam,I’m Adam
#include <iostream>
#include <cctype>
#include <string>
#include <cstring>
using namespace std;
pair<int, int> expandStr(string s, int left, int right) {
int l = s.size();
while (left >= 0 && right < l) {
if (!isalnum(s[left])) {
left--;
continue;
}
if (!isalnum(s[right])) {
right++;
continue;
}
if (s[left] >= 'A' && s[left] <= 'Z') {
s[left] += 32;
}
if (s[right] >= 'A' && s[right] <= 'Z') {
s[right] += 32;
}
if (s[left] == s[right]) {
left--;
right++;
}
else break;
}
return{ left + 1, right - 1};
}
int main() {
string s;
while (getline(cin, s)) {
int start = 0, end = 0;
int l = s.size();
for (int i = 0; i < l; i++) {
auto p1 = expandStr(s, i, i);
auto p2 = expandStr(s, i, i + 1);
if (p1.second - p1.first > end - start) {
start = p1.first;
end = p1.second;
}
if (p2.second - p2.first > end - start) {
start = p2.first;
end = p2.second;
}
}
while (!isalnum(s[start]) && start <= end) {
start++;
}
while (!isalnum(s[end]) && end >= start) {
end--;
}
cout << s.substr(start, end - start + 1) << endl;
s.clear();
}
return 0;
}