序列str1和序列str2
长度分别为m和n;
创建1个二维数组str[m][n]来保存结果,并初始化为0;
m和n分别从0开始,m++,n++循环:
(默认字符串均不为空)
如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1;
如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]}
最后从L[m,n]中的数字一定是最大的,且这个数字就是最长公共子序列的长度
1. #include<stdio.h> 2. #include<string.h> 3. #include<algorithm> 4. using namespace std; 5. int main() 6. { 7. char str1[205]; 8. char str2[205]; 9. int str[205][205]; 10. while(scanf("%s%s",str1+1,str2+1)!=EOF) 11. { 12. int length1=strlen(str1+1); 13. int length2=strlen(str2+1); 14. memset(str,0,sizeof(str)); 15. for(int i=1; i<=length1; i++) 16. { 17. for(int j=1; j<=length2; j++) 18. { 19. if(str1[i]==str2[j]) 20. str[i][j]=str[i-1][j-1]+1; 21. else 22. str[i][j]=max(str[i-1][j],str[i][j-1]); 23. } 24. } 25. printf("%d\n",str[length1][length2]); 26. } 27. return 0; 28. }