Coincidence-题解(寻找最长公共子序列问题)

一、题目链接

https://www.nowcoder.com/practice/f38fc44b43cf44eaa1de407430b85e69?tpId=40&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

二、题目分析

算法思路:动态规划

注意公共子序列与公共子串的区别:公共子串连续的字符串,而公共子序列是有序的字符序列。

解题分析:讨论一下dp[i][j]的值:

dp[i][j]表示s1的前i个字符与s2的前j个字符的最长公共子序列长度。

dp[i][j]只有三种可能取值:dp[i-1][j-1]+1,dp[i-1][j],dp[i][j-1]

假如s1[i]=s2[j]的话,dp[i][j]=dp[i-1][j-1]+1;

否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[101][101];
 4 int main(){
 5     string s1,s2;
 6     cin>>s1>>s2;
 7     for(int i=0;i<s1.length();i++){
 8         memset(dp[i],0,sizeof(dp[i]));
 9         if(s1[i]==s2[0])  dp[i][0]=1; //处理j=0的情况 
10         for(int j=1;j<s2.length();j++){//处理j>0的情况
11             if(i==0){ //处理i=0的情况 
12                 if((s1[i]==s2[j])) dp[i][j]=1;
13             }
14             else{  //处理i>0的情况 
15                 if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1]+1;
16                 else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
17             }
18         }
19     }
20     cout<<dp[s1.length()-1][s2.length()-1]<<endl;
21 }
posted @ 2021-03-11 22:15  saaas  阅读(82)  评论(0编辑  收藏  举报