题目描述
找出给出的字符串S中最长的回文子串。假设S的最大长度为1000,并且只存在唯一解。
示例1
输入
复制
"abcba"
输出
复制
"abcba"
思路:
将原先s1 反转得到s2
求解s1与s2的最长公共子串
求解最长公共子串方法
动态规划 dp
- dp[i][j]表示s1[i]与s2[j]匹配关系 若不等置为0 否则置为1
- 那么最长公共子串,即寻找二维数组中 最长的对角线为1的长度
- 进一步优化 若匹配时 dp[i][j]=dp[i-1][j-1]+1 即一旦匹配,利用上之前对角线的数值 在此基础上++
- 一旦长度更大,记录下index下标以及更新max
int dp[1001][1001];
//最长公共子串长度
string max_fun(string s1,string s2)
{
int _max=0;
for(int i=0;i<1001;i++)
{
dp[0][i]=0;
dp[i][0]=0;
}
int index=-1;
for(int i=0;i<s1.size();i++)
for(int j=0;j<s2.size();j++)
{
if(s1[i]==s2[j])
{
dp[i+1][j+1]=dp[i][j]+1;
if(dp[i+1][j+1]>_max)
{
_max=dp[i+1][j+1];
index=i;
}
}
else
dp[i+1][j+1]=0;
}
return s1.substr(index-_max+1,_max);
}
string longestPalindrome(string s) {
// write code here
if(s.size()==0)
return string("");
if(s.size()==1)
return s;
string s2=s;
reverse(s2.begin(), s2.end());
return max_fun(s, s2);
}