这个应该是动态规划入门题。很多讲动态规划的都是用这道题去讲。
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<int> p(text2.size()+1,0);//注意这里数组开辟大小要加一
//一开始运行总有问题,但就是没想到这个
vector<vector<int> > dp(text1.size()+1,p);
int res=0;
for(int i=1;i<=text1.size();i++)
for(int j=1;j<=text2.size();j++)
{
if(text1[i-1]==text2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
res=max(dp[i][j],res);
}
return res;
}
};
尝试压缩空间,用一位数组去记忆,但是失败了。只好看答案
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int dp[text2.size()+1],pre,temp,res=0;
memset(dp,0,sizeof(dp));//学习了数组初始化方法,好东西
for(int i=1;i<=text1.size();i++)
{
pre=dp[0];
for(int j=1;j<=text2.size();j++)
{
//pre=dp[j];
//这里我只用这一行代码,只用了一个变量,自然是无法保存,因为到下轮开始就会更新了,所以应该是先保存下来,等到dp[j]更新过后,再更新到pre
temp=dp[j];
if(text1[i-1]==text2[j-1])
dp[j]=pre+1;
else
dp[j]=max(dp[j],dp[j-1]);
res=max(dp[j],res);
pre=temp;
}
}
return res;
}
};