IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 最长回文子串(dp解法) -> 正文阅读

[数据结构与算法]最长回文子串(dp解法)

题目大意

题目传送门:https://leetcode-cn.com/problems/longest-palindromic-substring/
给你一个字符串,寻找其中最长回文子串并输出。

DP解法

首先对题目进行分析,这个最长的回文子串有什么特点?对于字符串str,假设dp[i,j]=1表示str[i…j]是回文子串,那个必定存在dp[i+1,j-1]=1。这样最长回文子串就能分解成一系列子问题,可以利用动态规划求解了。首先构造状态转移方程:
在这里插入图片描述
则整个方程的初始状态应该是这样的:
在这里插入图片描述
意思就是单个字符一定是一个回文串,连续两个相邻的相等字符也一定是回文串,比如“aa”。
这样就可以写出代码:

class Solution {
public:
        string longestPalindrome(string s) {
        if (s.empty()) return "";
        int len = s.size();
        if (len == 1)return s;
        int longest = 1;
        int start=0;
        int dp[1005][1005] = {0};
        for(int i = 0;i<len;i++)
        {
            dp[i][i] = 1;
            if(i<len-1)
            {
                if(s[i]==s[i+1])
                {
                    dp[i][i+1] = 1;
                    start = i;
                    longest = 2;
                }
            }
        }
        for(int l = 3;l<=len;l++)//子串的长度,范围是从3到len
        {
            for(int i = 0;i+l-1<len;i++)
            {
                int j = i+l-1;//终点
                if(s[i]==s[j] && dp[i+1][j-1]==1)
                {
                    dp[i][j] = 1;
                    start = i;
                    longest = l;
                }
            }
        }
        return s.substr(start,longest);
    }
};

另一种解法(Manacher)

一种专门用来解决此类问题的算法叫做“马拉车算法”,总体思想是“中心扩展”,由于回文子串的特性,遍历整个字符串,分别以每个字符作为对称轴向两边进行扩展,直至找到最长的回文子串。但是要注意回文子串长度为奇数和偶数的处理方法不太一样,具体的解释请参考:https://www.cxyxiaowu.com/2869.html中的方法三

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:53:24  更:2021-08-12 16:57:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:42:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码