写完后后去看了下别人的代码,发现自己的还是不够精炼.仍需努力
根据需求,也添加了简短注释。
update:12/25 
最近又看了看马拉车算法,这里给出中心扩散法求回文数.

题目地址 L2-008 最长对称子串 (25 分)

#include <bits/stdc++.h>
using namespace std;
string s;
int cont, tmp, mmax, Index, flag;
int main() {
	getline(cin,s);
	for(int i = 0; i < s.length(); i++) {
		cont = tmp = flag = 0;
		//Index 是用来记录是否存在偶数中心点的情况
		Index = i;
		for(int j = i + 1; j < s.length() && !flag; j++) 
			//当前点(i)的后面元素相同  相同则Index记录下标
			s[i] == s[j] ? Index = j : flag = 1;
		// 从当前中心点的前后进行比较是否相同
		while(s[i - ++tmp] == s[Index + tmp] && i - tmp >= 0 && Index + tmp < s.length())
			cont++;
		mmax < cont * 2 + 1 + Index - i ? mmax = cont * 2 + 1 + Index - i : 0;	
	}
	cout<<mmax<<endl;
}

中心扩散法(推荐做法)

#include <bits/stdc++.h>
using namespace std;

int center(string s, int start, int end) {
	while(start >=0 && end <s.length()) {
		if(s[start] == s[end]) {
			start--;
			end++;
		}else{
			break;
		}
	}
	return end - start - 1;
}

int longestPalindrome(string s) {
	if(s.length() == 0) return 0;
	if(s.length() == 1 ) 
		return 1; 
	int mmax = 0;
	for(int i = 1; i < s.length(); i++) {
		int len1 = center(s, i, i);
		int len2 = center(s, i-1, i);
		int len = max(len1, len2);
		if(len > mmax) {
			mmax = len;
		}
	}
	return mmax;
} 

int main() {
	string s;
	getline(cin,s);
	cout<<longestPalindrome(s)<<endl;
    return 0;
}