九度 题目1528:最长回文子串
题目1528:最长回文子串
- 题目描述:
-
回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
回文子串,顾名思义,即字符串中满足回文性质的子串。
给出一个只由小写英文字符a,b,c...x,y,z组成的字符串,请输出其中最长的回文子串的长度。
- 输入:
-
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于200000。
- 输出:
-
对于每组测试用例,输出一个整数,表示该组测试用例的字符串中所包含的的最长回文子串的长度。
- 样例输入:
-
abab bbbb abba
- 样例输出:
-
3 4 4
- 来源:
- 腾讯2013年实习生招聘二面面试题
- 我想说的话: 这是个老生常谈的问题了,思想就是枚举2类对称点,关键是要把代码写清晰好看点。
-
#include <iostream> #include <string.h> #include <string> #include <algorithm> #include <stdio.h> #include <queue> #include <set> #include <limits.h> #include <fstream> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std ; const int size=200008; char str[size] ; struct Me{ int Len ; int gao_1(int k){ int L ,R ,ans=1; L=k-1 ; R=k+1 ; while(L>=0&&R<Len&&str[L]==str[R]){ ans+=2 ; L-- ; R++ ; } return ans ; } int gao_2(int i ,int j){ int L=i ,R=j ,ans=0; while(L>=0&&R<Len&&str[L]==str[R]){ ans+=2 ; L-- ; R++ ; } return ans ; } int gao_qi(){ int ans=1 ; Len=strlen(str) ; for(int i=0;i<Len;i++){ ans=Max(ans,gao_1(i)) ; ans=Max(ans,gao_2(i,i+1)) ; } return ans ; } }; int main(){ while(scanf("%s",str)!=EOF){ Me me ; printf("%d ",me.gao_qi()) ; } return 0 ; }