Topic: Find the longest palindrome string and find the palindrome string

dynamic programming

#include<bits/stdc++.h>
using namespace std;
const int N = 2e4 + 10;
string s;
int dp[N][N];
int main()
{
	cin >> s;
	int n = s.size();
	for(int i = 0; i < n; i ++)
	{
		dp[i][i] = 1;//长度为1的字符串都是回文串	
	}
	int maxlen = 1;//记录最长回文串 
	int start;
	for(int len = 2; len <= n; len ++)//枚举回文串长度 
	{
		for(int left = 0; left + len - 1 < n; left ++)//枚举左端点 
		{
			int right = left + len - 1;//枚举右端点 
			if(s[left] != s[right])//左右两边不一样一定不是回文串
			{
				dp[left][right] = 0;	
			}
			else//左右两边一样,说明当前字符串是否是回文串取决于[left + 1...right - 1]区间的字符串是否是回文串 
			{
				if(len == 2)dp[left][right] = 1;
				else
				{
					dp[left][right] = dp[left + 1][right - 1];	
				} 
			}
			if(len > maxlen)
			{
				if(dp[left][right] == 1)
				{
					maxlen = len;
					start = left;
				}
			}
		}	
	} 
	cout << maxlen;
	string t = "";
	for(int i = start; i < start + maxlen; i ++)t += s[i];
	cout << t;
	return 0;
}

Guess you like

Origin blog.csdn.net/m0_75087931/article/details/132924533