浙大pat1040 Longest Symmetric String(25 分)

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 
#include 
using namespace std;
int main(int argc, char *argv[]) {
	string so;
	getline(cin,so);
	int length = so.length();
	string s;
	for(int i=0;is.length())
			break;
		}
		if(max

  第二种思路就是把串翻转过来,转化成求两个串最大子序列的问题(一般都有板子的)这里借鉴了(https://blog.csdn.net/zhangpiu/article/details/50733603)

#include 
#include 
#include 
#include 
 
using namespace std;
 
string maxSubString(string s1, string s2){
	int xlen = (int)s1.size(), ylen = (int)s2.size();
	vector> m(xlen, vector(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;

  

转载于:https://www.cnblogs.com/SK1997/p/9588868.html

你可能感兴趣的:(浙大pat1040 Longest Symmetric String(25 分))