首页 > 编程语言 >代码随想录算法训练营 | 647. 回文子串,516.最长回文子序列

代码随想录算法训练营 | 647. 回文子串,516.最长回文子序列

时间:2024-10-19 20:31:58浏览次数:1  
标签:子串 int chars 随想录 len 647 dp 回文

647. 回文子串
题目链接:647. 回文子串
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰回文子串
日期:2024-10-19

想法:本题精髓在于dp[i][j]表示的是s[i,j]这个子字符串是不是回文的,是Boolean类型,s[i]s[j]不等时,肯定不回文;s[i]s[j]相等时,开始看ij的大小,ij大小相等那么表示单个字符的情况,回文,大小差距为1,表示的是像“aa”这种情况,回文;大小差距大于1了,就得看这两个字符中间的子串是不是回文的了即看dp[i + 1][j - 1]是不是为true;初始化当然起始全部都是false;遍历顺序还有要注意由于有dp[i + 1][j - 1],所以列得从下往上走,行还是继续从左往右就行了。
Java代码如下:

class Solution {
    public int countSubstrings(String s) {
        char[] chars = s.toCharArray();
        int res = 0;
        int len = chars.length;
        boolean[][] dp = new boolean[len][len];
        for(int i = len - 1; i >= 0; i--) {
            for(int j = i; j < len; j++) {
                if(chars[i] == chars[j]) {
                    if(j - i <= 1) {
                        dp[i][j] = true;
                        res++;
                    }else if(dp[i + 1][j - 1]){
                        dp[i][j] = true;
                        res++;
                    }
                }
            }
        }
        return res;
    }
}

516.最长回文子序列
题目链接:516.最长回文子序列
文档讲解︰[代码随想录(programmercarl.com)](https://programmercarl.com/0516.最长回文子序列.html)
视频讲解︰最长回文子序列
日期:2024-10-19

想法:dp[i][j]表示s区间[i,j]中得最长子序列长度,跟上面字串是不一样的;s[i]s[j]相等,原长度dp[i + 1][j - 1]加2,不相等,就看是不要前一个长还是不要后一个长,即dp[i + 1][j]dp[i][j - 1];初始化显然dp[i][i]区间只有一个字符时长度为1;遍历顺序跟上面一样。
Java代码如下:

class Solution {
    public int longestPalindromeSubseq(String s) {
        char[] chars = s.toCharArray();
        int len = chars.length;
        int[][] dp = new int[len][len];
        for(int i = 0; i < len; i++) {
            dp[i][i] = 1;
        }

        for(int i = len - 1; i >= 0; i--) {
            for(int j = i + 1; j < len; j++) {
                if(chars[i] == chars[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }else {
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][len - 1];
    }
}

标签:子串,int,chars,随想录,len,647,dp,回文
From: https://www.cnblogs.com/wowoioo/p/18486521

相关文章

  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点
    1.leetcode24两两交换链表中的节点题目链接:24.两两交换链表中的节点-力扣(LeetCode)文章链接:代码随想录(programmercarl.com)视频链接:帮你把链表细节学清楚!|LeetCode:24.两两交换链表中的节点_哔哩哔哩_bilibili1.1代码这个代码是用循环的思路来进行判断的,写的过程挺......
  • P1435 [IOI2000] 回文字串
    尝试了几次发现添加的字符数等于n-正着的和反着的最长公共子序列的长度,即为答案。正序与倒序“公共”的部分就是我们回文的部分,如果把正序与倒序公共的部分减去你就会惊奇的发现剩余的字符就是你所要添加的字符,也就是所求的正解。点击查看代码#include<iostream>#include<st......
  • 代码随想录打卡Day2
                                                                                                                                   ......
  • 代码随想录打卡Day3
    链表:通过指针链接的线性数据结构。链表由两部分组成,一为数据域,一为指针域。并与结构体有很大关系,链表的节点一般都是结构体,其中包含了该节点的数据部分以及指向下一节点的指针。通过这种方式,链表将结构体与指针连接起来,从而构建一个强大的数据结构,可以同时实现数据的组织和动......
  • 代码随想录算法训练营day19| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插
    学习资料:https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html****学习记录:235.二叉搜索树的最近公共祖先(加一个函数traversal)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(self,x):#self.val=x......
  • 代码随想录算法训练营day18 |530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数
    学习资料:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html530.二叉搜索树的最小绝对差(双指针法,pre&cur,设置最小差值初始为无穷大,当差值<最小差值就更新最小差值)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(......
  • 代码随想录算法训练营第三天|203.移除链表元素,707.设计链表,206.反转链表
    1前言今日主要学习链表的基础leetcode203移除链表元素leetcode707设计链表leetcode206反转链表2链表的基础链表分为单链表和双链表,与字符串的区别就是链表是在一个里面存储了数据+下一个数据的内存地址链表中存储的内存空间是可以不连续的2.1链表的定义2.1.1......
  • 代码随想录算法训练营 | 115.不同的子序列,583. 两个字符串的删除操作,72. 编辑距离
    115.不同的子序列题目链接:115.不同的子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰不同的子序列日期:2024-10-18想法:dp[i][j]表示以s[i-1],t[j-1]结尾的s,t自学列中满足s的子序列为t的个数,如果s[i-1],t[j-1]相等,那么个数应该跟双方上一个结尾状态dp[i-1][j-......
  • 每日OJ题_牛客_非对称之美_最长非回文字符串_C++_Java
    目录牛客_非对称之美_最长非回文字符串题目解析C++代码Java代码牛客_非对称之美_最长非回文字符串非对称之美(nowcoder.com)题目解析找到规律就是最长非回文字符串(判断是否全同->0,否则是n-1(回文减去1)或n)。C++代码#include<iostream>usingnamespacestd;int......
  • 代码随想录算法训练营 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和,392.判断
    1143.最长公共子序列题目链接:1143.最长公共子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰最长公共子序列日期:2024-10-17想法:这里的子序列不要求连续了,dp[i][j]要表示为在text1[0,i-1]和text2[0,j-1]的范围里,最长的公共子序列长度,-1同样是为了初始化方便,如果te......