最长公共子序列

#include <stdio.h>
#include <string.h>

static const int MAX = 100;

char str1[MAX], str2[MAX], str3[MAX];

int c[MAX][MAX], f[MAX][MAX];

inline int max(int a, int b) {
	return a>b ? a : b;
}

int dp(int i, int j) {
	if (c[i][j] == -1) {
		if (i==0 || j==0) {
			c[i][j] = 0;
		} else if (str1[i-1] == str2[j-1]) {
			c[i][j] = dp(i-1, j-1) + 1;
			f[i][j] = 1;
		} else {
			if (dp(i, j-1) > dp(i-1, j)) {
				c[i][j] = dp(i, j-1);
				f[i][j] = 2;
			} else {
				c[i][j] = dp(i-1, j);
				f[i][j] = 3;
			}
		}
	}
	return c[i][j];
}

void fill(int i, int j, int len) {
	if (len < 0) {
		return;
	}
	if (f[i][j] == 1) {
		str3[len] = str1[i-1];
		fill(i-1, j-1, len-1);
	} else if (f[i][j] == 2) {
		fill(i, j-1, len);
	} else if (f[i][j] == 3) {
		fill(i-1, j, len);
	}
}

int main() {
	while (1) {		
		memset(c, -1, sizeof(c));		
		memset(f, 0, sizeof(f));
		scanf("%s%s", str1, str2);
		int len = dp(strlen(str1), strlen(str2));
		str3[len] = 0;
		fill(strlen(str1), strlen(str2), len-1);
		printf("%s\n", str3);
	}
	return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *