首页 > 编程语言 >算法随想Day50【动态规划】| LC647-回文子串、LC516-最长回文子序列

算法随想Day50【动态规划】| LC647-回文子串、LC516-最长回文子序列

时间:2023-03-15 14:14:32浏览次数:135  
标签:LC516 子串 LC647 int count 回文 dp size

LC647. 回文子串

动态规划法:

遍历顺序:从下往上,从左往右

当s[i]与s[j]相等时,需要考虑三种情况:

  • 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
  • 情况二:下标i 与 j相差为1,例如aa,也是回文子串
  • 情况三:下标:i 与 j 相差大于1的时候,例如cabac,此时 s[i] 与 s[j] 已经相同了,我们看 i 到 j 区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i + 1 与 j - 1区间,这个区间是不是回文就看dp[i + 1] [j - 1]是否为true。

int countSubstrings(string s)
{
    int size = s.size();
    int count = 0;
    vector<vector<bool>> dp(size, vector<bool>(size, false));
    for (int i = s.size() - 1; i >= 0; i--)
    {
        for (int j = i; j < s.size(); j++)
        {
            if (s[i] == s[j])
            {
                if (j - i <= 1)
                {
                    ++count;
                    dp[i][j] = true;
                }
                else if (dp[i + 1][j - 1] == true)
                {
                    ++count;
                    dp[i][j] = true;
                }
            }
        }
    }
    return count;
}

中心拓展法:

int countSubstrings(string s)
{
    int size = s.size();
    int count = 0;
    for (int i = 0; i < size; ++i)
    {
        count += extend(s, i, i, size);
        count += extend(s, i, i + 1, size);
    }
    return count;
}
int extend(const string& s, int left, int right, int size)
{
    int ret = 0;
    while (left >= 0 && right <= size - 1 && s[left] == s[right])
    {
        --left;
        ++right;
        ++ret;
    }
    return ret;
}

LC516. 最长回文子序列

有了上一题的基础,起码知道如何列dp二维矩阵了

dp[i] [j]含义:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i] [j]。

int longestPalindromeSubseq(string s)
{
    int size = s.size();
    vector<vector<int>> dp(size, vector<int>(size, 0));
    for (int i = size - 1; i >= 0; --i)
    {
        for (int j = i; j < size; ++j)
        {
            if (s[i] == s[j])
            {
                if (i == j)
                    dp[i][j] = 1;
                else
                    dp[i][j] = dp[i + 1][j - 1] + 2;
            }
            else
                dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);
        }
    }
    return dp[0][size - 1];
}

标签:LC516,子串,LC647,int,count,回文,dp,size
From: https://www.cnblogs.com/Mingzijiang/p/17218260.html

相关文章

  • 647. 回文子串
    题目647回文子串给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。回文字符串是正着读和倒过来读一样的字符串。子字符串是字符串中的由连续字符组成......
  • 回文数!
    //需求:给你一个整数x,如果x是一个回文整数,打印ture,否则,返回false。//解释:回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。//例如:121是回文数,而123不......
  • 回文数
    1importjava.util.*;23publicclassMain{4publicstaticvoidmain(Stringargs[]){5into,t,th,f,before,behind=0;6for(int......
  • 特殊回文数
    1importjava.util.*;23publicclassMain{4publicstaticvoidmain(String[]args){5Scannerscanner=newScanner(System.in);6......
  • 洛谷 P1015 回文数
    P1015回文数https://www.luogu.com.cn/problem/P1015原题很明显的高精度,(1999年竟然就考主要有:高精度加法(含进位)、高精度判断回文数以及可以把字符串转成数字数组......
  • 5.最长回文子串
    最长回文子串给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"......
  • 【LeetCode回溯算法#05】分割回文串(复习双指针判断回文以及substr函数使用记录)
    分割回文串力扣题目链接给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。示例......
  • 回文山
     /***@version1.0*@auther孙沐华*StringBuffer跟StingBuilder字符串内容是存在char[]value,所以在变化(增加/删除)*中不用每次都更换地址(即不是每次都......
  • 680. 验证回文字符串 Ⅱ
    给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例1:输入:"aba"输出:True示例2:输入:"abca"输出:True解释:你可以删除c字符。 ......
  • 【DFS】LeetCode 131. 分割回文串
    题目链接131.分割回文串思路使用DFS,同时依次检查分割的字符串是否是回文串。注意:需要频繁添加删除末尾元素时,可以使用Deque代码classSolution{privateLis......