给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
这道题一开始我是用了暴力求解,即设定i,j头尾指针,left,right为子串窗口,s[i]与s[j]相等时两指针同时向中间靠拢。s[i]与s[j]不相等时,情况有三种,(1)s[i+1]==s[right],i自加并更新left;(2)s[j-1]==s[left],j自减并更新right;(3)前两种情况都不成立,此时应该只更新i或j,再去判断剩下的子串是否存在回文串。在实际写的时候,第三种情况我错误的写成了同时更新i和j,导致例"eabcb"始终不通过。看了leetcode下面的题解,还是采用动态规划吧。
C语言代码:
char * longestPalindrome(char * s){
int i,j,start;
int len=strlen(s),tem_len,max_len;
int dp[50][50]={0}; //C语言...二维数组
char *ps;
ps=(char*)malloc(sizeof(char)*(len+1)); //字符串只有一个元素时避免'\0'越界报错
if(len==0 || len==1) return s;
for(i=0;i<len;i++)
{
dp[i][i]=1; //初始化 单个字符肯定是回文串
}
start=0,max_len=1;
for(j=1;j<len;j++)
{
for(i=1;i<j;i++)
{
if(s[i]==s[j])
{
if(j-i<3) //此时区间长度小于等于2 首尾字符相同则为回文串
{
dp[i][j]=1;
}
else
{
dp[i][j]=dp[i+1][j-1];
}
}
else dp[i][j]=0;
if(dp[i][j])
{
tem_len=j-i+1;
if(tem_len>max_len)
{
max_len=tem_len;
start=i;
}
}
}
}
for(i=start,j=0;i<max_len+start;i++,j++)
{
ps[j]=s[i];
}
ps[j]='\0';
return ps;
}
这是按照leetcode题解下面一个java代码写的,C语言没法定义动态二维数组,提交之后''bb''结果总是错误,但是java就没问题,无解。