返回最长子回文串

输入: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;
	}
}

 

猜你喜欢

转载自blog.csdn.net/Li_haiyu/article/details/88576237