辨析常见理解问题:
子串:指的是字符串中连续的n个字符,例如对于字符串adkbl, 其中adk,dkb,kbl都是它的子串
子序列:指的是字符串中不一定连续但先后顺序一致的n个字符,例如对于字符串adkbl, 其中abl,akl都是它的子序列,可以不连续挑选,但要保持原来的顺序
接下来是代码展示(求最长公共子序列长度+随机输出一个最长公共子序列+输出所有最长公共子序列)都结合在代码里
#include<bits/stdc++.h>
using namespace std;
int dp[1010][1010];
int len1,len2;
string s1,s2;
void fn()
{
int i,j;
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if (s1[i]==s2[j])
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
void print1()
{
vector<char>q;
int l1=len1,l2=len2;
while(l1&&l2)
{
if (s1[l1]==s2[l2])
{
q.push_back(s1[l1]);
l1--;
l2--;
}
else if (dp[l1-1][l2]>dp[l1][l2-1])
l1--;
else l2--;
}
for(int i=q.size()-1;i>=0;i--)
cout<<q[i];
cout<<endl;
}
set<string>ans;
void print2(int len1,int len2,string cnt)
{
while(len1&&len2)
{
if (s1[len1]==s2[len2])
{
cnt=s1[len1]+cnt;
len1--;
len2--;
}
else if (dp[len1-1][len2]>dp[len1][len2-1])
{
len1--;
}
else if (dp[len1-1][len2]<dp[len1][len2-1])
{
len2--;
}
else {
print2(len1-1,len2,cnt);
print2(len1,len2-1,cnt);
return ;
}
}
ans.insert(cnt);
}
int main ()
{
while(cin>>s1>>s2)
{
memset(dp,0,sizeof(dp));
len1=s1.size();
len2=s2.size();
s1=" "+s1;
s2=" "+s2;
fn();
cout<<dp[len1][len2]<<endl;//输出最长长度
//print1();//随机输出一个最长公共子序列
print2(len1,len2,"");//输出所有最长公共子序列
for(set<string>::iterator i=ans.begin();i!=ans.end();i++)//遍历set
cout<<*i<<endl;
ans.clear();
}
return 0;
}