动态规划算法求最长回文子串

回文串就是正着读和反着读一样的字符串,如“abba”,”abcba”,最长回文子串是字符串的子串中最长的属于回文串的子串。如字符串”abbaabccba”的最长回文子串为”abccba”,本文采用动态规划算法来查找最长回文子串,算法时间复杂度为O(n²)。设状态dp[j][i]表示索引j到索引i的子串是否是回文串。则易得转移方程如下:

《动态规划算法求最长回文子串》

则dp[j][i]为true时表示索引j到索引i形成的子串为回文子串,且子串起点索引为i,长度为j+i-1。

具体程序如下:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
	string longestPalindrome(string s) {
		const int n=s.size();
		bool dp[n][n];
		fill_n(&dp[0][0],n*n,false);
		int max_len=1; //保存最长回文子串长度
		int start=0;//保存最长回文子串起点
		for(int i=0;i<s.size();++i)
		{
			for(int j=0;j<=i;++j)
			{
				if(i-j<2)
					dp[j][i]=(s[i]==s[j]);
				else
					dp[j][i]=(s[i]==s[j] && dp[j+1][i-1]);
				if(dp[j][i] && max_len<(i-j+1))
				{
					max_len=i-j+1;
					start=j;
				}
			}
		}
		return s.substr(start,max_len);
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	string input;
	Solution sln;
	while(cin>>input)
	{
		cout<<"最长回文子串为:"<<sln.longestPalindrome(input)<<endl;
	}
	return 0;
}

输入abbaabccba时,程序运行结果如下:

《动态规划算法求最长回文子串》

    原文作者:动态规划
    原文地址: https://blog.csdn.net/shineboyxxb/article/details/52079360
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞