力扣---最长回文子串---二维动态规划

二维动态规划思路:

首先,刚做完这道题:力扣---最长有效括号---动态规划,栈-CSDN博客,所以会有一种冲动,设立gi,表示以第i位为结尾的最长回文子串长度,然后再遍历一遍取最大长度即可。但是,后来发现如果gi如此表示,很难得到递推公式。所以转到二维,设立gij(bool),将其表示以第i位开头第j位结尾的子串是否是回文子串,并用l和r记录到目前为止最长回文子串的左索引和右索引。所以,递推公式为gij={如果si==sj且gi+1j-1是回文子串,则为1}。此时有需要独立判断两种情况:第一种情况是子串长度为1,gii=1,第二种情况是子串长度为2(j-i==1),如果si==sj,则gij=2。

还要说明一点,为什么在二重循环时,i 的顺序是从len-1到0,j 的顺序是从i到len。因为由gi+1j-1推及gij,所以我们需要先从左下角向右上角开始推,行数(i)从大到小,列数(j)从小到大。

代码:

C++:

cpp 复制代码
class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        vector<vector<bool>> g(len,vector<bool>(len,false));

        for(int i=0;i<len;i++){g[i][i]=true;}
        int l=0;
        int r=0;

        for(int i=len-1;i>=0;i--){
            for(int j=i;j<len;j++){
                if(s[i]==s[j]){
                    if(j-i==1){
                        g[i][j]=true;
                    }
                    else{
                        if(i+1<len && j-1>=0 && g[i+1][j-1]==true){
                            g[i][j]=true;
                        }
                    }
                }
                if(g[i][j]==true && j-i>r-l){
                    l=i;
                    r=j;
                }
            }
        }
        return s.substr(l,r-l+1);
    }
};

Python:

python 复制代码
class Solution:
    def longestPalindrome(self, s: str) -> str:
        len_s=len(s)
        g=[[False for _ in range(len_s)] for _ in range(len_s)]

        for i in range(len_s):
            g[i][i]=True
        l=0
        r=0

        for i in range(len_s-1,-1,-1):
            for j in range(i,len_s):
                if s[i]==s[j]:
                    if j-i==1:
                        g[i][j]=True
                    else:
                        if i+1<len_s and j-1>=0 and g[i+1][j-1]==True:
                            g[i][j]=True
                if g[i][j]==True and j-i>r-l:
                    l=i
                    r=j
        return s[l:r+1]

注意这句话的写法:

python 复制代码
g=[[False for _ in range(len_s)] for _ in range(len_s)]
相关推荐
Dovis(誓平步青云)1 分钟前
总用电下降了,为什么家庭能源看板仍然提示异常
java·开发语言·数据库·人工智能·算法·电脑·能源
程序猿乐锅1 分钟前
【从0-1学习Python | 第四篇】Python 字符串和元组
java·开发语言·笔记·后端·python·学习
专注API从业者2 分钟前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
Rebecca_aLi3 分钟前
码匠教育:从手工表格到脚本自动化,Python 改造工作流的思路
运维·python·自动化
开开心心就好5 分钟前
A3的PDF怎么切成A4?拖一下分割线就行
服务器·开发语言·python·算法·pdf·ocr·tornado
小黄人软件7 分钟前
python 模块(Module)与包(Package)的区别,python xxx.py、python -m xxx 和 import xxx 三者的区别
开发语言·python
闻缺陷则喜何志丹30 分钟前
详细设计说明书的内容要求
算法·测试·存储
砚底藏山河33 分钟前
量化新手误区:因子计算与行情数据的工程化解耦
java·数据库·python·金融
考研保研资料分享33 分钟前
车辆与机械保研经验合辑:西交、浙大预推免与专业笔试面试复盘
面试·职场和发展
Logic10135 分钟前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质