最长公共子序列问题

最长公共子序列问题

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

Input

输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。

Output

每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。

Sample Input

ABCBDAB
BDCABA

Sample Output

4


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


int w[10001][10001]; //一开始数组开大了,导致我的cb无法编译


int main(void)
{
    char a[1000], b[1000];
    int i,  len1, len2, j;


    while(gets(a) != NULL)
    {
        //这里不能用getchar,因为没有用scanf来读取东西,所以不需要getchar来吸收,若用了,则会误吸收一个字符
        gets(b);


        len1 = strlen(a);
        // printf("%d\n", len1);


        len2 = strlen(b);


        w[len1][len2] = 0;


        for(i = 0; i <= len1; i++)
        {
            w[i][0] = 0; //初始化边界条件,i指a中的所有字母与b中没有字母时。
        }


        for(j = 0; j <= len2; j++)
        {
            w[0][j] = 0;
        }


        for(i = 1; i <= len1; i++)
        {
            for(j = 1; j <= len2; j++)
            {
                if(a[i - 1] == b[j - 1]) //因为是数组,所以可以直接判断相不相等
                {
                    w[i][j] = w[i - 1][j - 1] + 1; //这里要等于len1与len2,因为最后一个相不相等存储下来的数要放到他的下一个空间来存储
                }


                else  //如果不相等,就看看单独的时候那个大
                {
                    if(w[i - 1][j] > w[i][j - 1])
                    {
                        w[i][j] = w[i - 1][j];
                    }


                    else
                    {
                        w[i][j] = w[i][j - 1];
                    }
                }
            }
        }


        printf("%d\n", w[len1][len2]);


    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/eider1998/article/details/80142709