L2-008 最长对称子串 (25 point(s))

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?

输出样例:

11

思路:

首先输入一行字符串,然后去找是否有相邻两个字符是一样的,然后用字符串dp[][](两个括号里的内容分别从表示回文子串的首尾)去记录让这个子串为1,然后长度开始从3开始,去比较s[i]和s[j]假如一样就看i+1位以及j-1位假如dp[i + 1][j - 1]为1的话,就说明之前是回文子串,那么现在也是回文子串了,这个时候记录下最大的长度就行了。

#include <iostream>
using namespace std;
const int maxn = 1010;
int dp[maxn][maxn] = {0};
int main() {
	string s;
	getline(cin, s);
	int ans = 1;
	for (int i = 0; i < s.size(); i++) {
		dp[i][i] = 1;
		if (s[i] == s[i + 1]) {
			ans = 2;
			dp[i][i + 1] = 1;
		}
	}
	for (int len = 3; len <= s.size(); len++) {
		for (int i = 0; i + len - 1 < s.size(); i++) {
			int j = i + len - 1;
			if (s[i] == s[j] && dp[i + 1][j - 1] == 1) {
				dp[i][j] = 1;
				ans = len;
			} 
		}
	}
	cout << ans << endl;
	return 0;
}