【面试经典150 | 动态规划】最长回文子串

news/2024/6/16 0:15:41 标签: 动态规划, 字符串, 回文串, C++

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题方法
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

动态规划】【字符串


题目来源

5. 最长回文子串


解题方法

方法一:动态规划

动态规划方法主要参考 官方题解,本题还有两种比较经典的方法,感兴趣的读者可以移步 一文多图讲清楚解决最长回文子串问题的【中心扩展算法】与【Manacher算法】。

思路

对于一个字符串,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,仍是回文串。例如字符串 “ababa”,如果我们知道已知 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是 ‘a’。

定义状态

根据这样的思路,我们可以使用动态规划的方法解决本题。我们使用 P(i, j) 表示字符串 s 的第 ij 个字母组成的串(即字符串 s[i, ..., j])是否为回文串,关于 P(i, j) 有以下两种情况:

  • P(i, j) = true,如果字符串 s[i, ..., j]回文串
  • P(i, j) = false,其他情况下。

这里的「其他情况」包括:

  • s[i, ..., j] 本身不是一个回文串
  • i > j,此时 s[i, ..., j] 不合法。

转移关系

根据以上分析有转移关系:

KaTeX parse error: Expected 'EOF', got '&' at position 24: … = P(i+1, j-1) &̲ (s[i] == s[j])…

base case

有一些边界条件:

最后返回

因为最后需要返回最长的回文子串,所以我们在更新 P(i, j) 的时候要记录取得最长回文子串的长度 maxLen 和起始字符 begin。最终返回 s.substr(begin, maxLen)

实现代码

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if (n < 2) return s;

        int maxLen = 1, begin = 0;
    vector<vector<int>> dp(n, vector<int>(n));

    // 初始化所有长度为 1 的子串都是回文串
    for (int i = 0; i < n; ++i) {
        dp[i][i] = true;
    }

    // 开始递推,先枚举子串长度
    for (int L = 2; L <= n; ++L) {
        // 枚举左边界
        for (int i = 0; i < n; ++i) {
            int j = L + i - 1; // 右边界
            if (j >= n) break;

            if (s[i] != s[j]) {
                dp[i][j] = false;
            }
            else {
                if (j - i < 3) {
                    dp[i][j] = true;
                }
                else {
                    dp[i][j] = dp[i+1][j-1];
                }
            }

            if (dp[i][j] && L > maxLen) {
                maxLen = L;
                begin = i;
            }
        }
    }
    return s.substr(begin, maxLen);
    }
};

复杂度分析

时间复杂度: O ( n 2 ) O(n^2) O(n2) n n n字符串的长度。

空间复杂度: O ( n 2 ) O(n^2) O(n2)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。


http://www.niftyadmin.cn/n/5469797.html

相关文章

深入了解Flutter中Overlay的介绍以及使用

Flutter Overlay 介绍 在 Flutter 中&#xff0c;Overlay 是一种特殊的 Widget&#xff0c;它可以用来在应用程序的其他部分之上显示内容。Overlay 非常适合用于显示模态对话框、弹出菜单、工具提示等。 Overlay 的工作原理 Overlay 位于 Flutter 的渲染树之外&#xff0c;这…

【Java笔记】多线程0:JVM线程是用户态还是内核态?Java 线程与OS线程的联系

文章目录 JVM线程是用户态线程还是内核态线程什么是用户态线程与内核态线程绿色线程绿色线程的缺点 线程映射稍微回顾下线程映射模型JVM线程映射 线程状态操作系统的线程状态JVM的线程状态JVM线程与OS线程的状态关系 Reference 今天复盘一下Java中&#xff0c;JVM线程与实际操作…

选数(dfs,isprime)

题目&#xff1a;P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com​​​​​​.cn) #include<bits/stdc.h> using namespace std; int n,k; int a[22]; long long ans; bool isprime(int n){for(int i2;i<sqrt(n);i){if(n%i0) return false;…

计算机网络针对交换机的配置

实验 目的 交换机的基本配置&#xff0c;交换机VLAN配置 实验条件 Windows&#xff0c;Cisco packet tracer 实验 内容 交换机的基本配置&#xff0c;交换机VLAN配置 实验 过程 一、交换机的基本配置 进入特权模式 Switch>enable 进入配置模式 Switch#configure ter…

蓝桥杯 - 受伤的皇后

解题思路&#xff1a; 递归 回溯&#xff08;n皇后问题的变种&#xff09; 在 N 皇后问题的解决方案中&#xff0c;我们是从棋盘的顶部向底部逐行放置皇后的&#xff0c;这意味着在任何给定时间&#xff0c;所有未来的行&#xff08;即当前行之下的所有行&#xff09;都还没…

知网参考文献引用格式转latex中BibTex-Python操作

处理思路 参考 处理步骤&#xff1a; &#xff08;单条处理&#xff1a;&#xff09; 1、选知网NoteExpress格式的2-7行复制信息 2、新建一个文本文件&#xff0c;命名为cite.txt&#xff0c;把知网所复制信息粘贴进来 &#xff08;txt文件保存编码ANSI可行&#xff09; 3、…

AcWing 786. 第k个数——算法基础课题解

AcWing 786. 第k个数 文章目录 题目描述思路CGo 题目描述 给定一个长度为 n的整数数列&#xff0c;以及一个整数 k&#xff0c;请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数&#xff08;所有整数均在 …

PCB封装又画错了?一张纸搞定封装检查!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海&#xff0c;原创文章欢迎点赞分享&#xff01; 相信很多同学在画PCB时都有过封装画错的精力&#xff0c;…