题目1252:回文子串
- 题目描述:
-
输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
- 输入:
-
存在多组数据,每组数据一行字符串,长度不大于100。
- 输出:
-
输出回文子串的最大长度。
- 样例输入:
-
google
- 样例输出:
-
4
算法分析
另外一种错位比较法 参见 1252:回文子串
源程序
//============================================================================ // Name : judo1252Manacher.cpp // Author : wdy // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <string> #include <vector> #include <cmath> using namespace std; void Manach(std::string &s){ std::vector<char> ns; ns.push_back('$'); ns.push_back('#'); int len = s.size(); for(int i = 0;i<len;i++){// become odd ns.push_back(s.at(i)); ns.push_back('#'); } len = ns.size(); int *mLen = new int[len]; //record max radius of sub string in the middle of id int mx = 0; int id = 0; int maxLen = 0; for(int i = 0;i<len;i++){ mLen[i] = 1; if(mx>i){ mLen[i] = max(mLen[2*id-i],mx-i+1); } while((i+mLen[i])<len && i-mLen[i]>0 && ns.at(i+mLen[i])==ns.at(i-mLen[i])) mLen[i]++; if(i + mLen[i]-1 >mx){ //update mx,id mx = i + mLen[i]-1 >mx; id = i; } if(mLen[i]>maxLen) //update maxLen maxLen = mLen[i]; } std::cout<<maxLen-1<<std::endl; } void judo(){ std::string s; while(std::cin>>s){ Manach(s); } } int main() { judo(); //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; } /************************************************************** Problem: 1252 User: KES Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/