冲刺大厂每日算法&面试题,动态规划21天——第十七天

目录标题

  • 导读

  • 21天动态规划入门

  • 面试题

  • 点击直接资料领取

导读

=====================================================================

在这里插入图片描述

肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。我们先来搞一下让大家最头疼的一类算法题,动态规划我们将进行为时21天的养成计划。还在等什么快来一起肥学进行动态规划21天挑战吧!!

21天动态规划入门

============================================================================

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = “babad”

输出:“bab”

解释:“aba” 同样是符合题意的答案。

示例 2:

输入:s = “cbbd”

输出:“bb”

示例 3:

输入:s = “a”

输出:“a”

示例 4:

输入:s = “ac”

输出:“a”

class Solution {

public String longestPalindrome(String s) {

if (s == null || s.length() < 1) {

return “”;

}

int start = 0, end = 0;

//从串的第一个元素为中心扩散

for (int i = 0; i < s.length(); i++) {

//以奇数子串为前提开始

int len1 = expandAroundCenter(s, i, i);

//以偶数子串为前提

int len2 = expandAroundCenter(s, i, i + 1);

//比较两者谁更大

int len = Math.max(len1, len2);

//找到新串的位置

if (len > end - start) {

start = i - (len - 1) / 2;

end = i + len / 2;

}

}

return s.substring(start, end + 1);

}

public int expandAroundCenter(String s, int left, int right) {

while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {

–left;

++right;

}

return right - left - 1;

}

}

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:

输入:s = “bbbab”

输出:4

解释:一个可能的最长回文子序列为 “bbbb” 。

示例 2:

输入:s = “cbbd”

输出:2

解释:一个可能的最长回文
子序列为 “bb” 。

对于一个子序列而言,如果它是回文子序列,并且长度大于 22,那么将它首尾的两个字符去除之后,它仍然是个回文子序列。因此可以用动态规划的方法计算给定字符串的最长回文子序列。

用 \textit{dp}[i][j]dp[i][j] 表示字符串 ss 的下标范围 [i, j][i,j] 内的最长回文子序列的长度。假设字符串 ss 的长度为 nn,则只有当 0 \le i \le j < n0≤i≤j<n 时,才会有 \textit{dp}[i][j] > 0dp[i][j]>0,否则 \textit{dp}[i][j] = 0dp[i][j]=0。

由于任何长度为 11 的子序列都是回文子序列,因此动态规划的边界情况是,对任意 0 \le i < n0≤i<n,都有 \textit{dp}[i][i] = 1dp[i][i]=1。

当 i < ji<j 时,计算 \textit{dp}[i][j]dp[i][j] 需要分别考虑 s[i]s[i] 和 s[j]s[j] 相等和不相等的情况:

如果 s[i] = s[j]s[i]=s[j],则首先得到 ss 的下标范围 [i+1, j-1][i+1,j−1] 内的最长回文子序列,然后在该子序列的首尾分别添加 s[i]s[i] 和 s[j]s[j],即可得到 ss 的下标范围 [i, j][i,j] 内的最长回文子序列,因此 \textit{dp}[i][j] = \textit{dp}[i+1][j-1] + 2dp[i][j]=dp[i+1][j−1]+2;

如果 s[i] \ne s[j]s[i]

=s[j],则 s[i]s[i] 和 s[j]s[j] 不可能同时作为同一个回文子序列的首尾,因此 \textit{dp}[i][j] = \max(\textit{dp}[i+1][j], \textit{dp}[i][j-1])dp[i][j]=max(dp[i+1][j],dp[i][j−1])。

由于状态转移方程都是从长度较短的子序列向长度较长的子序列转移,因此需要注意动态规划的循环顺序。

最终得到 \textit{dp}[0][n-1]dp[0][n−1] 即为字符串 ss 的最长回文子序列的长度。

class Solution {

public int longestPalindromeSubseq(String s) {

int n = s.length();

int[][] dp = new int[n][n];

for (int i = n - 1; i >= 0; i–) {

dp[i][i] = 1;

char c1 = s.charAt(i);

for (int j = i + 1; j < n; j++) {

char c2 = s.charAt(j);

if (c1 == c2) {

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][n - 1];

}

}

面试题

======================================================================

继续二叉树的阶段:

//构建节点类

package tree;

public class node {

public int val;

public node left;//左孩子

public node right;//右孩子

public node() {

}

public node(int val,node left,node right) {

this.val=val;

this.left=left;

this.right=right;

}

public node(int val, node left) {

super();

this.val = val;

this.left = left;

}

}

package tree;

public class nodeNum {

//全部节点个数

public static int nodenum(node root) {

if(root==null)return 0;

int left=nodenum(root.left);

int right=nodenum(root.right);

return left+right+1;

}

//叶子节点个数

public static int leafNodeNum(node root) {

if(root==null)return null;

if(root.leftnull&&root.rightnull) {

return 1;

}

return leafNodeNum(root.left)+leafNodeNum(root.right);

}

}

特别介绍

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

点击直接资料领取

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-nBlHTnC9-1719677545431)]

[外链图片转存中…(img-cpDO7WCT-1719677545432)]

[外链图片转存中…(img-QKza4usK-1719677545432)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值