LeetCode回文串专题——最长回文子串,分割回文串

LeetCode 回文串专题整理

  • 前言
  • LeetCode #5——最长回文子串
    • 题目描述
    • 算法思想与代码实现
  • LeetCode #131——分割回文串
    • 题目描述
    • 算法思路与代码实现
  • LeetCode #132——分割回文串 II
    • 题目描述
    • 算法思想与代码实现
  • LeetCode #1278 分割回文串 III
    • 题目描述
    • 算法描述与代码实现

前言

字符串是算法中常考的数据类型,回溯或动态规划是解决这类问题的常用算法。

在字符串中,回文串是一类特殊的存在。运用上述二算法解决回文串是其运用在字符串中的典型例题。

在这篇文章中,我们选取 LeetCode 经典例题—— #5 最长回文子串、#131 分割回文串、#132 分割回文串 II、#5278 分割回文串 III ——来详细介绍解决回文串问题的思路,希望对读者有所帮助。

LeetCode #5——最长回文子串

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例

输入:“babad”
输出:“bab” 或者 “aba”

算法思想与代码实现

动态规划

我们首先用这道题说明一下动态规划在回文串中的应用。

动态规划的最大意义是减少不必要的判断,比如我们已经判断 “aba” 是一个回文串,若判断 “cbabc” 是否是回文串,仅需要在 “aba” 的基础上判断首尾字符是否相等即可,不需要重新判断。

因此,我们给出 d p ( i , j ) dp(i,j) dp(i,j) 定义如下:
d p ( i , j ) = { t r u e , i f   S i … S j   i s P a l i n d r o m i c f a l s e , o t h e r w i s e dp(i,j) = \left\{ \begin{array}{rl} true &,if~S_i\dots S_j~is Palindromic \\ false&,otherwise \end{array}\right. dp(i,j)={ truefalse,if SiSj isPalindromic,otherwise
所以,
d p ( i , j ) = ( d p ( i + 1 , j − 1 )   a n d   s [ i ] = = s [ j ] ) dp(i,j) = \big(dp(i + 1,j - 1) ~and~s[i]==s[j]\big) dp(i,j)=(dp(i+1,j1) and s[i]==s[j])

同时,我们需要维持一个最长回文子串长度,一旦当前回文子串的长度大于维持的长度,立即更新最长长度和答案。

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

你可能感兴趣的:(Leetcode,回文串,动态规划,回溯,LeetCode,C++)