Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length

of S is 1000, and there exists one unique longest palindromic substring.

思路。

1)动态规划。

这里动态规划的思路是 dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。

则根据回文的规则我们可以知道:

如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]

当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。

动态规划的进行是按照字符串的长度从1 到 n推进的。

2)中心扩展法

 因为回文字符串是以中心轴对称的,所以如果我们从下标 i 出发,用2个指针向 i 的两边扩展判断是否相等,那么只需要对0到

n-1的下标都做此操作,就可以求出最长的回文子串。但需要注意的是,回文字符串有奇偶对称之分,即"abcba"与"abba"2种类型,

因此需要在代码编写时都做判断。

#include <iostream>
using namespace std;

string getExpandAroundCenter(string s,int pre,int post)
{
	string res;	
	int len;
	while(pre >= 0 && post <= s.size()-1 && s[pre] == s[post])
	{
		pre --;
		post ++;		
	}len = post - pre + 1; res = s.substr(pre,len);	
	return res;
}

string longestPalindromicSub(string s)
{
	if(s.size() == 0 || s.size() == 1)return s;
	int longest=0;
	string str1,str2,res;
	for(int i=0;i<s.size()-1;i++)
	{
		//abcba
		str1 = getExpandAroundCenter(s,i,i);
		//abba
		str2 = getExpandAroundCenter(s,i,i+1);
		if(str1.size()>str2.size())
		{
			if(str1.size() > longest)
			{
				longest = str1.size();
				res = str1;
			}
		}
		else
		{
			if(str2.size() > longest)
			{
				longest = str2.size();
				res = str2;
			}
		}		
	}
	return res;	
}

void main()
{
	string s ="qabcbafffd";
	string res = longestPalindromicSub(s);
	printf("The longest palindromic substring is %s.\n",res.c_str());
}



你可能感兴趣的:(Longest Palindromic Substring)