1040 Longest Symmetric String(25 分)
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
题目思路:这个题实质是求最长回文子串的长度。
有两种思路,第一种是以中间元素为中心,向两边扩散,这种写法及其好写,但是麻烦的是遇到abba这种偶数个回文串的情况就不知道怎么办了。在网上找到了一个神奇的方法,就是往每个字符串两边添加一个字符,之后再将总数除以2即可
这是该思路的链接https://blog.csdn.net/sunbaigui/article/details/8656933
贴一下我写的代码:
#include <iostream> #include <string> using namespace std; int main(int argc, char *argv[]) { string so; getline(cin,so); int length = so.length(); string s; for(int i=0;i<length;i++) { s.push_back('-'); s.push_back(so[i]); } s.push_back('-'); int max = -1; for(int i=1;i<s.length()-1;i++) { int tmp_length=1; int p,q; p = i-1; q = i+1; while (s[p] == s[q]) { p--; q++; tmp_length+=2; if(p<0||q>s.length()) break; } if(max<tmp_length) max = tmp_length; } cout<<max/2; }
第二种思路就是把串翻转过来,转化成求两个串最大子序列的问题(一般都有板子的)这里借鉴了(https://blog.csdn.net/zhangpiu/article/details/50733603)
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; string maxSubString(string s1, string s2){ int xlen = (int)s1.size(), ylen = (int)s2.size(); vector<vector<int>> m(xlen, vector<int>(ylen, 0)); int maxlen = -1, index = -1; for(int i = 0; i < xlen; ++i){ for(int j = 0; j < ylen; ++j){ if(s1[i] == s2[j]){ if(i == 0 || j == 0) m[i][j] = 1; else m[i][j] = m[i-1][j-1] + 1; if(maxlen < m[i][j]){ maxlen = m[i][j]; index = i - maxlen + 1; } } } } return s1.substr(index, maxlen); } int main(){ string s; getline(cin, s); string rs(s); reverse(begin(rs), end(rs)); cout << maxSubString(s, rs).size(); return 0;