
思想:
- 定义g[i][j]:text1的前i位和text2的前j位的最长公共子序列长度。
- 递推公式:如果text[i]==text[j],那么只需要看g[i-1][j-1]即可,此时g[i][j]=g[i-1][j-1]+1。如果text[i]!=text[j],那么g[i][j]=max(g[i-1][j],g[i][j-1],g[i-1][j-1])
- 数组初始化:由g[i-1][j],g[i][j-1],g[i-1][j-1]推及g[i][j],即由左上角向右下角推(两层for循环都是从小到大遍历,推荐博客:力扣—最长回文子串—二维动态规划-CSDN博客(考察for循环遍历顺序)),需要初始化第0行和第0列。
代码:
C++:
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int len1=text1.size();
int len2=text2.size();
vector<vector<int>> g(len1,vector<int>(len2,0));
//g[0][0]
if(text1[0]==text2[0]){g[0][0]=1;}
else{
g[0][0]=0;
}
//g[0][i]+g[i][0]
for(int i=1;i<len2;i++){
if(text1[0]==text2[i]){g[0][i]=1;}
else{
g[0][i]=g[0][i-1];
}
}
//cout<<"***"<<endl;
for(int i=1;i<len1;i++){
if(text1[i]==text2[0]){g[i][0]=1;}
else{
g[i][0]=g[i-1][0];
}
}
for(int i=1;i<len1;i++){
for(int j=1;j<len2;j++){
if(text1[i]==text2[j]){
g[i][j]=g[i-1][j-1]+1;
}
else{
g[i][j]=max(g[i-1][j],g[i][j-1]);
g[i][j]=max(g[i][j],g[i-1][j-1]);
}
}
}
return g[len1-1][len2-1];
}
};
Python:
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
len1=len(text1)
len2=len(text2)
g=[[0 for _ in range(len2)] for _ in range(len1)]
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**





**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**

### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:

给大家整理的电子书资料:

**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-5JjKgTQ1-1712892588864)]