-
题目描述:
-
Find a longest common subsequence of two strings.
-
输入:
-
First and second line of each input case contain two strings of lowercase character a…z. There are no spaces before, inside or after the strings. Lengths of strings do not exceed 100.
-
输出:
-
For each case, output k – the length of a longest common subsequence in one line.
-
样例输入:
-
abcd cxbydz
-
2
-
算法分析:
-
经典动态规划题目,给两个字符串,求最长公共子串长度
-
设dp[i][j] 存放a,b两个字符串中前I和前J个字符中公共子串的长度
-
动态规划公式为:
-
初始化:
-
dp[0][j] = 0; 0<=j<=bl;
-
dp[i][0] = 0; 0<=i<=al;
-
遍历中:
-
dp[i+1][j+1] = dp[i][j] + 1; a[i] = b[j] 0<=i<=al ;0<=j <=bl;
-
dp[i+1][j+1] = maxIndex(dp[i+1][j], dp[i][j+1]); a[i] != b[j] 0<=i<=al; 0<=j<=al;
-
代码:
-
/************************************************************** Problem: 1042 User: hrdjmax2 Language: C++ Result: Accepted Time:10 ms Memory:1560 kb ****************************************************************/ #include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[102][102]; char a[102]; char b[102]; void initdp(int al, int bl) { int i; for(i=0;i<=al;i++) { dp[i][0] = 0; } for(i=0;i<=bl;i++) { dp[0][i] = 0; } } int maxdp(int a, int b) { return (a>b)?a:b; } int main() { int al,bl,i,j,maxIndex; while(cin>>a) { cin>>b; al = strlen(a); bl = strlen(b); initdp(al, bl); maxIndex = 0; for(i=0;i<al;i++) { for(j=0;j<bl;j++) { if(a[i] == b[j]) { dp[i+1][j+1] = dp[i][j] + 1; } else { dp[i+1][j+1] = maxdp(dp[i][j+1], dp[i+1][j]); } if(maxIndex < dp[i+1][j+1]) { maxIndex = dp[i+1][j+1]; } } } cout<<maxIndex<<endl; } }
-
-
样例输出: