动态规划经典问题:寻找最长公共子序列

该问题为动态规划的经典问题。输入两个字符串,如cnblogs和belong,则最长公共子序列为blog。

        

设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>,则:
       1. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
       2. 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
       3. 若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。
其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn-1>,Zk-1=<z1, z2, …, zk-1>。


代码如下:

static string GetLongestCommonStr(string str1, string str2)

        {
            if (str1 == "" || str2 == "")
            {
                return "";
            }


            int len1 = str1.Length;
            int len2 = str2.Length;
            string[,] matrix = new string[len1+1,len2+1];


            for (int i = 0; i <= str1.Length; i++)
                matrix[i, 0] = "";


            for (int j = 0; j <= str2.Length; j++)
                matrix[0, j] = "";


            for (int i = 1; i <= len1; i++)
            {
                for (int j = 1; j <= len2; j++)
                {
                    if (str1[i-1] == str2[j-1])
                    {
                        matrix[i, j] = matrix[i - 1, j - 1] + str1[i-1];
                    }
                    else
                    {
                        int l1 = matrix[i, j - 1].Length;
                        int l2 = matrix[i - 1, j].Length;
                        if (l1 > l2)
                        {
                            matrix[i, j] = matrix[i, j - 1];
                        }
                        else
                        {
                            matrix[i, j] = matrix[i - 1, j];
                        }
                    }
                }
            }
            return matrix[len1,len2];
        }
        static void Main(string[] args)
        {
            string ret = GetLongestCommonStr("cnblogs", "belong");


            System.Console.WriteLine(ret);


            Console.Read();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值