首页 > 其他分享 >leetcode--5. 最长回文子串(dp)

leetcode--5. 最长回文子串(dp)

时间:2024-02-05 23:45:35浏览次数:27  
标签:子串 -- qquad int size leetcode dp 回文

记录
23:29 2024-2-5

https://leetcode.cn/problems/longest-palindromic-substring/

dp[i][j] s[i, j] 之间能否构成回文子串
[i,j]之间是否能够构成需要考虑[i+1, j-1]是否构成回文子串且s[i] == s[j]
当j-1 >= i+1 时候说明正好是 俩个相邻的字符,此时如果s[i] == s[j]就肯定可以构成回文子串

\[dp[i][j] = \begin{cases} dp[i + 1][j - 1] \qquad if \ \ j - 1 >= i + 1 \&\ \& s[i] == s[j] \\ 1 \qquad \qquad \qquad \qquad else \ \ if \ \ s[i] == s[j] \end{cases} \]

点击查看代码
class Solution {
public:

    // dp[i][j] [i, j] 之间能否构成回文子串
    /* dp[i][j] = {
        dp[i + 1][j - 1]  if j - 1 >= i + 1 && s[i] == s[j]
        1                 else s[i] == s[j]
    }*/
    string longestPalindrome(string s) {
        int dp[s.size()][s.size()];
        memset(dp, 0, sizeof(dp));
        int begin = 0, maxSize = 1; 
        for(int i = s.size() - 1; i >= 0; i--) dp[i][i] |= 1;
        for(int i = s.size() - 1; i >= 0; i--) {
            for(int j = i + 1; j < s.size(); j++) {
                if(s[i] == s[j]) {
                    if(j-1 >= i+1) {
                        dp[i][j] |= dp[i+1][j-1];
                    } else  {
                        dp[i][j] |= 1;
                    }
                    //注意需要判断dp[i][j]
                    if(dp[i][j] && maxSize < j - i + 1) {
                        maxSize = j - i + 1;
                        begin = i;
                    }
                }
            }
        }
        return s.substr(begin, maxSize);
    }
};

标签:子串,--,qquad,int,size,leetcode,dp,回文
From: https://www.cnblogs.com/57one/p/18009019

相关文章

  • C#获得项目最后编译时间
    C#获得项目最后编译时间效果具体格式可以自定义核心代码stringGetCompileVersion(){stringOriginVersion=""+System.IO.File.GetLastWriteTime(this.GetType().Assembly.Location);intMsgCnt=0;stringyear="";stringmonth="";......
  • 获取用户详细信息
    //在userController中,写好控制类@GetMapping("userInfo")publicResult<Object>userInfo(@RequestHeader(name="Authorization")Stringtoken){Map<String,Object>map=JwtUtil.parseToken(token);Stringusername......
  • (13/60)滑动窗口最大值、前K个高频元素
    滑动窗口最大值leetcode:239.滑动窗口最大值第一个hard!workout!资源占用竟然如此之大,,单调队列法思路需要一个抽象的类队列数据结构,每轮移动时:1.把队首pop;2.把下一元素push进队尾;3.获取队列最大值存入数组。pop实现:每次移动时尝试(说“尝试”是因为可能已经弹出了)弹出队首......
  • (11/60)有效的括号、删除字符串中所有相邻重复项、逆波兰表达式求值
    有效的括号leetcode:20.有效的括号实现思路遍历到左括号,入栈对应的右括号(方便遍历到右括号时进行对比);遍历到右括号,对比栈顶元素。把无效三种情况照顾到:1.左括号多了(遍历结束后栈不为空);2.左右括号不匹配(右括号时栈顶元素与当前元素对比);3.右括号多了(右括号时栈是空的)。复......
  • Reinforcement Learning Chapter2
    本文参考《ReinforcementLearning:AnIntroduction(2ndEdition)》SuttonK臂赌博机问题描述:你有k个选择,每个选择对应一个奖励,收益由所选动作决定的平稳概率分布产生,目标为最大化某段时间内的总收益期望。联系我们在chapter1中提到的reward,value,action等概念,我们在这个K臂赌博机......
  • Ubuntu 配置samba
     参考链接:[shared]comment=SharedFolderpath=/home/user/sharebrowseable=yesreadonly=noguestok=yescreatemask=0755directorymask=0755 关键点:1.配置samba用户和密码2.配置共享路径3.samb.conf中的内容按上面的填写就行。4.可以使用......
  • 方法的重载和命令行传参
    方法的重载重载就是在一个类中,有相同的函数名称,但形参不同的函数。方法的重载的规则:方法名称必须相同。参数列表必须不同。(个数不同、或类型不同,参数排列顺序不同等)方法的返回类型可以相同也可以不相同。仅仅返回类型不同不足以成为方法的重载。实现理论:方法名称相......
  • PAT-乙级-1007(素数对猜想)
    让我们定义dn​为:dn​=pn+1​−pn​,其中pi​是第i个素数。显然有d1​=1,且对于n>1有dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。输入格式:输入在一行给出正整数N。输出格式:在一行中......
  • 可变参数
    可变参数JDK1.5开始,Java支持传递同类型的可变参数给一个方法。在方法声明中,在指定参数类型后加一个省略号(...)。一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。publicstaticvoidprintMax(double...numbers){if(num......
  • Prim算法
    问题描述有一张\(n\)个顶点、\(m\)条边的无向图,且是连通图,求最小生成树。Prim算法简析\(Prim\)算法是一种求最小生成树的算法。设该图为\(G=(V,E)\)。最小生成树即所求为\(G_T=(V_T,E_T)\),因为图是连通的,所以最小生成树会覆盖所有的顶点,即\(V==V_T\)。\(G_T\)......