9.2 Subsequence

Longest common subsequence problem (最长公共字串)
如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子序列,并打印出最长公共子序列。

例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子序列,则输出它们的长度4。

当然这里,我们也是要先找递归的。假设我的两个sequence,一个是X,长度为n;另一个是Y,长度为m。 现在假设我有两个point,一个是i,指在X的最后一个元素上,另一个是j,指在Y的最后一个元素上。我们的递归应该是分三种情况的。
1.如果X[i] == Y[j] 那么LCS(X[0:i],Y[0:j]) = LCS(X[0:i-1],Y[0:j-1]) + 1
这个很明显,因为发现了一组公共元素,就看剩下的有多少公共元素。
2.如果X[i] != Y[j] 那么 LCS(X[0:i],Y[0:j]) = max( LCS(X[0:i-1], Y[0:j]), LCS(X[0:i], Y[0:j-1]) )
这个其实也很容易相同,就是如果发现不同的,就去掉X或Y的最后一个,然后和另一个完整的比较,这样去掉X还是Y的最后一个,就有两种可能,所以就是要找中间max的一个。
3.如果 i=0 或者 j=0,就return 0
因为有一个sequence已经完了。

EXAMPLE INPUT

BDCABA
ABCBDAB

EXAMPLE OUTPUT

4

主程序 (不能修改)

#include "source.c"

#include <stdio.h>

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

我的答案

#include <string.h>
#define Max(x,y)(x>y?x:y)
int LCS(char text1[],char text2[]){
   int i=strlen(text1);
   int j=strlen(text2);
   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]));  
   } 
}
上一篇: 9.3 Subsequence 2 下一篇: 9.1 Rod cutting
支持 makedown语法