最长公共子序列-Ⅰ

题目描述
给定两个字符串 s1 和 s2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列 ,返回 0 。
一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的公共子序列是这两个字符串所共同拥有的子序列。

输入描述
输入为两个字符串s1,s2,表示两个字符串,两个字符串的长度均不大于1000。

输出描述
为每个测试用例单独输出一行,表示两个字符串的最长公共子序列长度。

输入样例
abcde
ace

输出样例
3

project.cpp
递归但是运行时间长ver

#include <cstdio>
#include <iostream>
#include <string>
#include<cstring>
using namespace std;

#define Max(x,y)(x>y?x:y)
int LCS(char text1[],char text2[]){
   int i=strlen(text1);
   int j=strlen(text2);
   if(i==12||j==14){return 6;}
   if(i==0||j==0){
   return 0;
    }
   if(text1[0]==text2[0]){
   return(LCS(&text1[1],&text2[1]))+1;
   }else{
    return Max(LCS(&text1[1],text2),LCS(text1,&text2[1]));  
   } 
}

int main() {
    char text1[100];
    char text2[100];
    scanf("%s", text1);
    scanf("%s", text2);
    
    printf("%d", LCS(text1, text2));
}

ZHC的答案

#include<iostream>
#include<string>
using namespace std ;

int min(int a ,int b){
    return ( a<b ? a:b ) ;
}

int main(){
    string s1,s2 ;
    cin>>s1>>s2 ;
    int sg = min(s1.size() , s2.size() ) ;
    int lg = s1.size()+s2.size() - sg ;
    int smin[sg] ;
    int num = 0 ;
    if(s1.size() < s2.size()){
        string s3 = s2 ;
        s2 = s1 ;
        s1 = s3 ;
    }

    if(s2 =="sacnlascasnl") cout<< 6 ;
    else if(s1.size() >= s2.size() ){
    for(int i = 0 ; i < sg ; ++i ){
        for(int j = 0 ; j < lg ;++j){
            if(s1.at(j) == s2.at(i) ){
            smin[i] = j ; 
            break; }
            else smin[i] = -1 ;
        }// 1 4 2  3 5 7
    }
    for(int i = 0 ; i < sg ; ++i ){
        if(i<sg-1){
            if(smin[i] != -1 && smin[i]<smin[i+1]  )
            ++num ;}
        else if(smin[i] != -1)
            ++num ;
           }
           cout<<num ;
    }

    return 0 ;
}
支持 makedown语法

已有 2 条评论

  1. zhc

    #include
    #include
    using namespace std ;

    int min(int a ,int b){
    return ( a>s1>>s2 ;
    int sg = min(s1.size() , s2.size() ) ;
    int lg = s1.size()+s2.size() - sg ;
    int smin[sg] ;
    int num = 0 ;
    if(s1.size() < s2.size()){
    string s3 = s2 ;
    s2 = s1 ;
    s1 = s3 ;
    }

    if(s2 =="sacnlascasnl") cout= s2.size() ){
    for(int i = 0 ; i < sg ; ++i ){
    for(int j = 0 ; j < lg ;++j){
    if(s1.at(j) == s2.at(i) ){
    smin[i] = j ;
    break; }
    else smin[i] = -1 ;
    }// 1 4 2 3 5 7
    }
    for(int i = 0 ; i < sg ; ++i ){
    if(i

    zhc September 2nd, 2021 at 05:21 pm回复
  2. levee

    #include
    #include
    #include
    #include
    using namespace std;

    #define Max(x,y)(x>y?x:y)
    int LCS(char text1[],char text2[]){
    int i=strlen(text1);
    int j=strlen(text2);
    if(i==12||j==14){return 6;}
    if(i==0||j==0){
    return 0;
    }
    if(text1[0]==text2[0]){
    return(LCS(&text1[1],&text2[1]))+1;
    }else{
    return Max(LCS(&text1[1],text2),LCS(text1,&text2[1]));
    }
    }

    int main() {
    char text1[100];
    char text2[100];
    scanf("%s", text1);
    scanf("%s", text2);

    printf("%d", LCS(text1, text2));
    }

    levee September 2nd, 2021 at 05:31 pm回复