1040.Longest Symmetric String

【题意】
        找出给的字符串中最长对称子串的长度

【思路】
        对长度分奇偶数分别进行二分查找,对于每个查找的长度判断是否存在该长度的对称子串,若存在则更新'left'指针,因为长度可能更长;若不存在则更新'right'指针,因为长度只会更短,更长的对称子串不可能存在。最后取奇数和偶数的最长子串长度中更大者即可。借助栈判断一个子串是否对称。

【注意点】
        若直接按总长度到1的递减顺序试探是否存在该长度的对称子串,则有两个点会超时,所以需要采用二分法。

【参考】
        1.    在给出的字符串的头尾和每个字符之间都插入一个特殊字符,使得原长n的字符串变成长为2n+1的串,这样一来新的串的对称子串长度就一定是奇数了,试探长度时step变化最小值为2。进而枚举中心点,甚至连二分都不用就可以过,可以学习一下这种办法。
         http://blog.csdn.net/sunbaigui/article/details/8656933
        这种思想其实是 Manacher算法,通过这种算法可在 线性时间内找到最长对称子串。
        2.    使用中的reverse可以倒置元素,方便判断字符串是否对称。另还有动态规划解法。这两种方法写起来都会简洁不少。
         http://blog.csdn.net/xtzmm1215/article/details/38746233


用Manacher算法写的:
#include 
#include 
#include 
#include 
using namespace std;

int main(){
	string str,tmp;
	vector p;

	getline(cin,str);
	int len = str.length();
	p.resize(2*len+1);
	for(int i=0; i=0 && tmp[i+p[i]]==tmp[i-p[i]]){
			p[i]++;
		}
		if(i+p[i]-1>mx){
			mx = i+p[i]-1;
			id = i;
		}
	}

	int maxLen = 0;
	for(int i=1; i




原来写的:
#include 
#include 
#include 
using namespace std;

bool isSymmetric(string str){
	stack s;
	int len = str.length();
	int i;
	for(i=0; imaxOdd){
		cout << maxEven;
	}
	else{
		cout << maxOdd;
	}

	system("pause");
	return 0;
}


你可能感兴趣的:(PAT(Advanced,Level))