最大回文子串:动态规划


思路:

dp[i][j]表示s[i]到s[j]的子串是否为回文。
如果s[i+1]到s[j-1]是回文串,那么再加上条件:s[i]==[j],则dp[i][j]为true。算法的时间复杂度依旧为O(N^2),但减少了重复计算的部分。
状态转移方程:

初始情况:
dp[i][i]=1
dp[i][i+1]=1 if str[i]==str[i+1]
单个字符,相邻字符相同都是回文串。

代码:

int longestPalindrome(char* s, int len)
{
	if (s == NULL || len <= 0)
		return 0;
	if (len == 1)
		return 1;
	int longest = 1;
	int start = 0;
	vector<vector<bool>> dp(len,vector<bool>(len)); //外层和内层大小都是len
	for (int i = 0; i < len; i++) //初始情况 两种
	{
		dp[i][i] = 1;
		if (i < len - 1)
		{
			if (s[i] == s[i + 1])
			{
				dp[i][i + 1] = 1;
				start = i;
				longest = 2;
			}

		}
	}
	for (int l = 3; l <= len; l++) //子串长度   状态转移的时候长度不断变长.
	{
		for (int i = 0; i + l - 1< len; i++)//保证右边界不越界
		{
			int j = i + l - 1;   //子串右边界
			if (dp[i + 1][j - 1] && s[i] == s[j])
			{
                    dp[i][j] = 1;
					start = i;
					longest = l;
			}
			
		}
	}
	return longest;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM