标签:== nbsp long ++ highlight ref ret com problems
立志要熟练动态规划,加油!
最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
思路:设dp[l][r]表示s[l……r]是否回文,枚举右边界r,然后从0枚举l一直到r,dp[r][l] = s[r]==s[l] && (r-1-l-1+1<=1 || dp[l+1][r-1]),意思是当s[r]和s[l]相等时,则需要s[l+1~r-1]也回文,而如果l+1~r-1这一段长度小于等于1,那么肯定回文,否则看dp[l+1][r-1]是否为true即可,因为dp[l+1][r-1]是已经得到的。
c++:
class Solution {
public:
string longestPalindrome(string s) {
int len=s.length(),dp[1005][1005];
if(len<=1)
return s;
for(int i=0;i<len;i++)
{
for(int j=0;j<len;j++)
dp[i][j]=0;
}
string ans=s.substr(0,1);
int mx=1;
for(int i=1;i<len;i++)
{
for(int j=0;j<i;j++)
{
if(s[i]==s[j]&&(i-j-2+1<=1||dp[j+1][i-1]))
{
dp[j][i]=1;
if(i-j+1>mx)
{
ans=s.substr(j,i-j+1);
mx=i-j+1;
// cout<<ans<<endl;
}
}
}
}
return ans;
}
};
标签:== nbsp long ++ highlight ref ret com problems
原文地址:https://www.cnblogs.com/mcq1999/p/11986547.html