在c#中找到2个字符串中的公共子串

时间:2015-05-26 18:14:16

标签: c# substring

我有像:

这样的字符串
1) Cookie:ystat_tw_ss376223=9_16940400_234398;
2) Cookie:zynga_toolbar_fb_uid=1018132522

3) GET /2009/visuels/Metaboli_120x600_UK.gif HTTP/1.1
4) GET /2010/07/15/ipad-3hk-smv-price-hk/ HTTP/1.1

1 ad 2有共同的子句{cookie:} 3和4有共同的子串{GET / 20,HTTP / 1.1}

我想找到两个字符串之间长度超过三个字符(包含空格字符)的所有常见子字符串。(如1和2) 我想用c#编码。我有一个程序,但它有一些问题。

有人可以帮助我吗?

    public static string[] MyMCS2(string a, string b)
    {          
        string[] st = new string[100];
       // List<string> st = new List<string>();
        List<char> f = new List<char>();
        int ctr = 0;                     
        char[] str1 = a.ToCharArray();
        char[] str2 = b.ToCharArray();
        int m = 0;
        int n = 0;
        while (m < str1.Length)
        {
            for (n = 0; n < str2.Length; n++)
            {
                if (m < str1.Length)
                {
                    if (str1[m] == str2[n])
                    {
                        if ((m > 1) && (n > 1) &&(str1[m - 1] == str2[n - 1]) && (str1[m - 2] == str2[n - 2]))
                        {
                            //f[m]= str1[m];
                            f.Add(str1[m]);

                            char[] ff = f.ToArray();
                            string aaa = new string(ff);

                            if (aaa.Length >= 3)
                            {
                                st[ctr] = aaa + "()";
                                //st.Add(aaa);

                                ctr++;                               
                            }


                            kk = m;
                            m++;
                        }                         

                        else if ((n == 0) ||(n == 1))
                        {
                            f.Add(str1[m]);
                            kk = m;
                            m++;
                        }

                        else
                            f.Clear();
                    }
                    //else  if ((str1[m] == str2[n]) && (m == str1.Length - 1) && (n == str2.Length - 1))
                    //{
                    //    f.Add(str1[m]);
                    //    char[] ff = f.ToArray();
                    //    string aaa = new string(ff);

                    //    if (aaa.Length >= 3)
                    //    {
                    //        st[ctr] = aaa;
                    //        ctr++;
                    //    }
                    //   // m++;
                    //}

                    else if ((str1[m] != str2[n]) && (n == (str2.Length - 1)))
                    {
                        m++;
                    }

                    else if ((m > 1) && (n > 1) && (str1[m] != str2[n]) && (str1[m - 1] == str2[n - 1]) && (str1[m - 2] == str2[n - 2]) && (str1[m - 3] == str2[n - 3]))
                    {
                        //
                        char[] ff = f.ToArray();
                        string aaa = new string(ff);

                        if (aaa.Length >= 3)
                        {
                            st[ctr] = aaa + "()" ;
                            //st.Add(aaa);

                            ctr++;
                            f.Clear();
                        }
                        //f.Clear();

                        //for (int h = 0; h < ff.Length; h++)
                        //{
                        //    f[h] = '\0';
                        //}
                    }
                    else if (str1[m] != str2[n])
                        continue;
                }
            }               
        }
        //int gb = st.Length;
        return st;
    }

2 个答案:

答案 0 :(得分:1)

这是一个完全匹配的问题,而不是子字符串。你可以用aho-corasick算法解决它。使用第一个字符串并计算有限状态机。然后处理搜索字符串。您可以扩展aho-corasick算法以使用通配符并搜索子字符串。您可以尝试以下动画示例:http://blog.ivank.net/aho-corasick-algorithm-in-as3.html

答案 1 :(得分:0)