首页 > 其他分享 >最长回文子串

最长回文子串

时间:2024-04-05 20:04:10浏览次数:24  
标签:子串 int 字符串 最长 dp 回文

letcode 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串
如果字符串的反序与原始字符串相同,则该字符串称为回文字串。

示例1

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

解题思路

此题可以用动态规划的思想去解决

1.明确dp[i][j]的含义

dp数组在此题中代表下标从i到j的回文字符串,
若为回文字符字串,则dp[i][j]为1,其余为0

2.写出动态转移方程

  1. 判断s[i]与s[j]是否相等
  2. 如果相等,则有三种情况: i==j;j-i=1;j-i>1前两种情况可以写成 j-i<=1,此时dp[i][j]=1
  3. 第三种情况:若要此时数组为回文字符字串,则它们中间的为回文字符串,i,i+1,i+2,…,j-1,j,即dp[i+1][j-1]
  4. 此时的状态转移方程为 dp[i][j]=dp[i+1][j-1]
判断循环的方向
 由于dp[i][j]=dp[i+1][j-1],即dp[i+1][j-1]在dp[i][j]在dp[i+1][j-1]的右上角,所以要从下到上,并且j的值从i到s的长度

最后

class Solution {
public:
    string longestPalindrome(string s) {
        int n=s.size();
        if(n==0||n==1)
        {
            return s;
        }
        //定义一个二维数组用来表示从i到j的字符串是否为回文字符串
        vector<vector<int >> dp(n,vector<int>(n));
        //left表示最长回文字符串的左边,right代表右边
        int left=0;
        int right=0;
        for(int  i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                {
                    if(j-i<=1)
                    {
                        dp[i][j]=1;
                    }
                    else
                    {
                        dp[i][j]=dp[i+1][j-1];
                    }
                }
                if(dp[i][j]&&right-left<j-i)//用来更新最长的回文字符串
                {
                    left=i;
                    right=j;
                }
            }
        }
        return s.substr(left,right-left+1);
    }
};

标签:子串,int,字符串,最长,dp,回文
From: https://blog.csdn.net/qq_75259370/article/details/137406994

相关文章

  • LeetCode in Python 300. Longest Increasing Subsequence (最长递增子序列)
    求最长递增子序列是深度优先搜索(DFS)的一种应用,有两种比较好的方法可以解决。第一种是动态规划法,时间复杂度为O(n*n),即设置边界条件和更新迭代公式求解最优解。第二种使用二分查找将时间复杂度降为O(nlogn)。本文给出两种方法的实现代码及说明。示例:图1最长递增子序列输入......
  • 回文素数----函数
    题目题目描述如果一个数即是回文数又是素数(质数)的话,则称这个数为回文素数。其中回文数的定义为,如果一个数从左边看和从右边看一样,则该数称为回文数。如数字12321就是个回文数。请输出从100~n的所有回文素数。输入格式一个整数n。输出格式从100~n的所有回文素数,空格......
  • P1439 【模板】最长公共子序列
    题面:回顾下最长公共子序列:if(a[i]!=b[j])dp[i][j]=max(dp[i-1][j],dp[i][j-1]);elsedp[i][j]=dp[i-1][j-1]+1;复杂度为O(n^2)但是这题不行,数据卡到了1e5,所以应该再次观察:注意到是两个全排列,那么利用map,把第一个序列当作基准列,做等效替换:把原来的值替换成1,2,3.........
  • 最长上升子序列LIS模板
    参考链接:https://blog.csdn.net/lxt_Lucia/article/details/81206439#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>......
  • Offer必备算法21_回文串dp_六道力扣题详解(由易到难)
    目录①力扣647.回文子串解析代码②力扣5.最长回文子串解析代码③力扣1745.分割回文串IV解析代码④力扣132.分割回文串II解析代码⑤力扣516.最长回文子序列解析代码⑥力扣1312.让字符串成为回文串的最少插入次数解析代码本篇完。①力扣647.回文子串64......
  • 2024年华为OD机试题-提取字符串中的最长数学表达式并计算
    提取字符串中的最长数学表达式并计算题目描述提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回0。简单数学表达式只能包含以下内容0-9数字,符号+-*说明1、所有数字,计算结果都不超过long2、如果有多个长度一样的,请返回第一个表达式......
  • Java | Leetcode Java题解之第9题回文数
    题目:题解:classSolution{publicbooleanisPalindrome(intx){//特殊情况://如上所述,当x<0时,x不是回文数。//同样地,如果数字的最后一位是0,为了使该数字为回文,//则其第一位数字也应该是0//只有0满足这一属......
  • 双指针做题总结2(76. 最小覆盖子串)
    76.最小覆盖子串 思路:双指针滑动窗口问题,指针的移动条件是双指针的核心。 反思:1、考虑右指针已经移动到最右端,无法继续移动的情况。(flag1的思路)2、用map.empty()是要千万注意:map[key]相当于往map中添加元素 代码:classSolution{public:unordered_map<char,i......
  • P4551 最长异或路径
    原题链接题解1.任意两点间的异或和等于他们到根节点的异或和的异或,令每个点到根节点的异或值为\(path[i]\)2.建立01字典树,塞入所有\(path[i]\)然后遍历每个点,找出每个点异或最大对应的点3.如何找?往当前\(path[i]\)的每一位相反的方向移动code#include<bits/stdc++.h>u......
  • 力扣每日一题:LCR112--矩阵中的最长递增路径
    题目给定一个 mxn 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。示例1:输入:matrix=[[9,9,4],[6,6,8],[2,1,1]]输出:4解释:最长递增路径为 [1......