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

输出:“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;

}

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人
3000705)]

[外链图片转存中…(img-ecNn13zH-1721173000705)]

[外链图片转存中…(img-CjBlRT2L-1721173000706)]

[外链图片转存中…(img-815jqdKI-1721173000706)]

[外链图片转存中…(img-tOftegUd-1721173000706)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-ro7CXLPt-1721173000707)]

关注我,点赞本文给更多有需要的人

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值