输入:abbafc
输出:abba
输入:cbabd
输出:bab
扩散法:考虑奇数回文。字符串长度为n,则i = 0开始遍历,左边为i-1,右边为i+1,判断左右的字符是否相等,如果相等则将left-right这段段字符串保存起来,然后left向左边扩散,right向右边扩散,依次判断是都相等,如果是则刷新刚才保存的串段。
考虑偶数回文。方法一样,只是这次左边为i-1右边为i即可。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void diffusion(string& s, vector<char>&max_s, int left,int right){
while (left >= 0 && right < s.length() && s[left] == s[right]) {
if (right - left + 1 > max_s.size()) {//如果检测出来的回文串比原来的长
max_s.clear();
for (int j = left; j <= right; j++) {//取到等于号
max_s.push_back(s[j]);
}
}
left--;
right++;
}
}
int main() {
string s;
while (cin >> s) {
vector<char> max_s;
if (s.length() == 1) {//长度为1
max_s.push_back(s[0]);
}
else{//长度大于2
for (int i = 0; i < s.length(); i++) {
diffusion(s, max_s,i-1,i+1);//回文串是奇数
diffusion(s, max_s, i - 1, i);//回文串是偶数
}
}
for (int i = 0; i < max_s.size(); i++) {
cout << max_s[i];
}
cout << endl;
}
}