给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
1.将每个点当作中心点挨个枚举,求出最长的区间即可。
代码如下:
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
if(len==0) return "";
int l=0,r=0;
int ans=0;
for (int i=0;i<len;i++)
{
int temp=1,tl=0,tr=0;
for (int j=1;j<=len;j++)
{
if(i-j<0||i+j>=len||s.charAt(i-j)!=s.charAt(i+j)) break;
temp+=2;
tl=i-j; tr=i+j;
}
if(ans<temp)
{
ans=temp;
l=tl; r=tr;
}
temp=0;
for (int j=1;j<=len;j++)
{
if(i-j+1<0||i+j>=len||s.charAt(i-j+1)!=s.charAt(i+j)) break;
temp+=2;
tl=i-j+1;tr=i+j;
}
if(ans<temp)
{
ans=temp;
l=tl; r=tr;
}
}
return s.substring(l,r+1);
}
}
2.动态规划:
代码如下:
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
if(len==0) return "";
int dp[][]=new int [1005][1005];
int ans=1,l=0,r=0;
for (int i=0;i<len;i++) dp[i][i]=1;
for (int i=1;i<len;i++)
{
if(s.charAt(i)==s.charAt(i-1))
{
dp[i-1][i]=2;
ans=2;
l=i-1; r=i;
}
}
for (int i=2;i<=len;i++)
{
for (int j=0;j<len-i;j++)
{
if(dp[j+1][j+i-1]!=0&&s.charAt(j)==s.charAt(j+i))
{
dp[j][j+i]=dp[j+1][j+i-1]+2;
if(ans<dp[j][j+i])
{
ans=dp[j][j+i];
l=j; r=j+i;
}
}
else
{
dp[j][j+i]=0;
}
}
}
return s.substring(l,r+1);
}
}