http://pat.zju.edu.cn/contests/pat-a-practise/1040
Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given "Is PAT&TAP symmetric?", the longest symmetric sub-string is "s PAT&TAP s", hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:Is PAT&TAP symmetric?Sample Output:
11
#include <cstdio> #include <iostream> #include <string> #include <algorithm> using namespace std; int main(){ string s; getline(cin, s); int len = 1; for (int i = 0; i < s.size(); i++){ for (int j = 0; j <= min(i, int(s.size())-1-i); j++){ string s2 = s.substr(i-j,2*j+1); string s3 = s2; reverse(s2.begin(), s2.end()); if (s2 == s3){ if (s2.size() > len) len = s2.size(); } string s4 = s.substr(i-j, 2*j+2); string s5 = s4; reverse(s4.begin(), s4.end()); if (s4 == s5){ if (s4.size() > len) len = s4.size(); } } } printf("%d\n", len); return 0; }
简单点的写法:
#include <cstdio> #include <iostream> #include <string> #include <algorithm> using namespace std; int main(){ string s; getline(cin, s); int len = 0; for (int i = 0; i < s.size(); i++){ int m = 0, n = 0, len1 = 0, len2 = 0; while(i - n >= 0 && i + n < s.size() && s[i - n] == s[i + n]){ len1 = 2 * n + 1; n++; } if (len1 > len) len = len1; while(i + 1 < s.size() && s[i] == s[i + 1] && i - m >= 0 && i + m + 1 < s.size() && s[i - m] == s[i + 1 + m]){ len2 = 2 * m + 2; m++; } if (len2 > len) len = len2; } printf("%d\n", len); return 0; }
网上看到的动态规划解法:
using namespace std; int main() { string s; getline(cin,s); //读取包含空格的一行 int max=1; int n=s.size(); //字符串长度 bool flag[1005][1005]; //s[i]~s[j]是否是回文,1是,0不是 int i,j; for(i=0;i<n;i++) for(j=0;j<=i;j++) flag[i][j]=true; for(j=1;j<n;j++) { for(i=0;i<j;i++) { flag[i][j]=false; if(s[i]==s[j]&&flag[i+1][j-1]==true) { flag[i][j]=true; if(j-i+1>max) max=j-i+1; } } } cout<<max; return 0; }