回文串就是正着读和反着读一样的字符串,如“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;
- }