栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

动态规划-5最长回文子串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态规划-5最长回文子串

!!!动态规划只能这样的消耗了吗,一起讨论,内存用了好多

1.方法说明

为什么i从大到小,j从i到大?因为i和j所指之间是回文子串的前提是,dp[i+1][j-1],即i的后一位,j的前一位之间的是回文子串,再加上i和j所指是相同的,则可判定为回文子串。 这落在二维数组中,就是从下往上,从左往右了。

2.函数说明

substr(size_type _Off = 0,size_type _Count = npos)函数

一种构造string的方法

形式 : s.substr(pos, len)

返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)

异常 :若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾

3.情况说明

1.i==j,即同一个字符,肯定是回文子串,且长度为1。

2.i==j-1,即相邻位置的字符,如果这两个字符相同,则是回文子串,且长度为2。

3.i

我们可以发现三种情况的大前提都是i和j位置的字符相同。

然后为了简便,情况1和2可以合并为j-i<=1。此时在和情况三或运算,即为下述代码

    string longestPalindrome(string s) {
        vector> dp(s.size(), vector(s.size(), 0)); //二维列表[i][j],i代表左边的指的点,j代表右边指的点
        int maxcount=-1;
        int left=s.size()-1;
        for(int i=s.size()-1;i>=0;i--){ //在二维角度看就是从下往上
            for(int j=i;j=maxcount){
                            left=i;
                            maxcount=j-i+1;
                        }
                    }
                }
            }
        }
        return s.substr(left,maxcount);
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号