(C#)最大公共子串

来源:互联网 发布:淘宝美工做什么工作的 编辑:程序博客网 时间:2024/06/05 19:03

这道算法题目,见了好多遍了,也没时间好好整理一下。这次稍微看了一点。

首先题目意思是这样的:

                                           两个字符串,求公共的连续子串的最大长度。

 例如:s1:  abcd    s2:bcde  则最大公共子串长度是3


首先,让我们看一下暴力解决:

<span style="font-size:18px;"> static int common(String s1, String s2)        {            int maxcount = 0;            for (int i = 0; i < s1.Length; i++)            {                for (int j = 0; j < s2.Length; j++)                {                    if (s1[i] == s2[j])                    {                        int tempcount=0;                        for (int k1 = i,k2=j; k1 < s1.Length && k2<s2.Length; k1++,k2++)                        {                            if (s1[k1] == s2[k2])                            {                                tempcount++;                            }                            else                            {                                break;                            }                        }                        if (tempcount > maxcount)                        {                            maxcount = tempcount;                        }                    }                }            }            return maxcount;        }</span>
暴力解决,明显是三层循环啊,所以是O(n^3)

下面,让我们先看一下动态规划的优化第一步:计算len[i][j]=len[i-1][j-1](前提是两个字符相同的情况下)

<span style="font-size:18px;"> static int commonmax(string s1, string s2)        {            int[,] len=new int[s1.Length,s2.Length];            int max = 0;            for (int i = 0; i < s1.Length; i++)            {                for (int j = 0;j< s2.Length; j++)                {                    if (s1[i] == s2[j])                    {                        if (i == 0 || j == 0)                        {                            len[i,j] = 1;                            if (max < len[i,j])                            {                                max = len[i,j];                            }                        }                        else                        {                            len[i,j] = len[i - 1,j - 1]+1;                            if (max < len[i,j])                            {                                max = len[i,j];                            }                        }                    }                    else                    {                        len[i,j] = 0;                    }                }            }            return max;        }</span>

画一个简图看一下:

       (s2)  b  c     e

(s1)

            0  0    0   0

            1   0   0   0

            0    2   0  0

            0    0    0



0 0