(C#)最大公共子串

這道算法題目,見了好多遍了,也沒時間好好整理一下。這次稍微看了一點。

首先題目意思是這樣的:

                                           兩個字符串,求公共的連續子串的最大長度。

 例如: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    d  e

(s1)

a             0  0    0   0

b             1   0   0   0

c             0    2   0  0

d             0    0   3  0



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章