LeetCode算法题

导读:本篇文章讲解 LeetCode算法题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目1.最长回文字符串LeetCode算法题

这题为动态规划(主要是找到状态转移方程)的子序列问题

 解题思路:

状态表示:dp[i][j]表示字符串的闭区间[i,j]内是否为回文字符串

   状态转移方程:当s[i]==s[j]的时候

          情况1:i==j;dp[i][j]为回文字符串;

          情况2:j-i==1;dp[i][j]为回文字符串;

          情况3:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j – 1]是否为回文字符串。

  求解时i,j的顺序

       LeetCode算法题

 

如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j – 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。

所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j – 1]都是经过计算的。

提交代码:

char * longestPalindrome(char * s){
    int i,j,left=0,right=0,dp[1001][1001]={0},max=0,k=0;
    char *p=malloc(sizeof(char)*1001);
    int len=strlen(s);
    for(i=len-1;i>=0;i--)
    {
        for(j=i;j<len;j++)
        {
            if(s[i]==s[j])
            {
                if(j==i)
                   dp[i][j]=1;
                if(j-i==1)
                   dp[i][j]=1;
                if(j-i>1)
                {
                    if(dp[i+1][j-1]==1)
                    {
                        dp[i][j]=1;
                    }
                }
            }
            if(dp[i][j]==1)
            {
               if(j-i+1>max)
               {
                   max=j-i+1;
                   left=i;
                   right=j;
               }
            }
        }
    }
    for(i=left;i<=right;i++)
    {
        p[k++]=s[i];
    }
    p[k]='\0';
    return p;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95970.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!