首页 新闻 会员 周边 捐助

请高手们帮我看看这个简单的算法..

0
悬赏园豆:10 [已解决问题] 解决于 2014-08-08 15:45

算法要求很简单,就是找出A,B两个字符串中,最大重叠部分.

我是这样写的,但觉得效率不好,有改进的地方,我将代码放上来,请高手们看看怎么改速度会快些,谢谢了!

 

 static List<string> GetMaxSameString(string a, string b, bool diffCaps = true)
        {
            List<string> res = new List<string>();
            if (!string.IsNullOrWhiteSpace(a) && !string.IsNullOrWhiteSpace(b))
            {
                if (a.Length > b.Length)
                {
                    string temp = a; a = b; b = a;
                }
                List<string> list = new List<string>();
                for (int posA = 0; posA < a.Length; posA++)//将a字符串中的每一个字符作为首字符串进行对比
                {
                    int tempPosA = posA;
                    StringBuilder sb = new StringBuilder();

                    for (int posB = 0; posB < b.Length; posB++)
                    {
                        string tempA = a.Substring(tempPosA, 1);
                        if (tempPosA == posA)//如果是对比首字符串,那么就用indexof进行快速定位,定位到要开始对比字符串的位置,而不用从头开始逐个对比
                        {
                            if (diffCaps)
                            {
                                posB = b.IndexOf(tempA, posB);
                            }
                            else
                            {
                                posB = b.IndexOf(tempA, posB, StringComparison.CurrentCultureIgnoreCase);
                            }
                            if (posB == -1) { break; }//如果剩下未对比字符中没有找到以首字符开头的,就退出
                        }
                        string tempB = b.Substring(posB, 1);
                        bool eqRes = false;
                        if (diffCaps)
                        {
                            eqRes = tempA.Equals(tempB);
                        }
                        else
                        {
                            eqRes = tempA.ToLower().Equals(tempB.ToLower());
                        }
                        if (eqRes)//如果匹配,就接着对比下一字符
                        {
                            sb.Append(tempA);
                            if (tempPosA + 1 < a.Length)
                            {
                                ++tempPosA;
                            }

                        }
                        else//如果不匹配,则-1对比当前字符是否可作为下次对比的首字符
                        {
                            tempPosA = posA;

                            if (sb.Length > 0)
                            {
                                list.Add(sb.ToString());
                                sb.Clear();
                                --posB;
                            }

                        }
                    }
                }
                string maxStr = "";
                foreach (string item in list)//找最大长度的字符
                {
                    if (item.Length > maxStr.Length)
                    {
                        maxStr = item;

                    }
                }
                foreach (string item in list)//找与最大长度相等内容不等的字符
                {
                    if (item.Length == maxStr.Length)
                    {
                        if (diffCaps)
                        {
                            if (!item.Equals(maxStr))
                            {
                                res.Add(item);
                            }
                        }
                        else
                        {
                            if (!item.ToLower().Equals(maxStr.ToLower()))
                            {
                                res.Add(item);
                            }
                        }

                    }
                }
                res.Add(maxStr);
            }
            return res;
        }
hexllo的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2014-08-05 11:28
< >
分享
最佳答案
0

这正是LINQ的用武之地:

Console.WriteLine(
    string.Join("", 
        "abcde".ToCharArray()
            .Intersect("cdefg".ToCharArray())));
收获园豆:9
dudu | 高人七级 |园豆:30585 | 2014-08-05 11:56

我靠,太强大了!

 

另外想问下,当相同字符串长度一样时,有没有什么办法?比如A中有ABCD ,B中有ABCD另外A中有XXYY,B中也有XXYY,这时,ABCD的长度和XXYY是一样的,这时有没有办法同时找出ABCD和XXYY来?

hexllo | 园豆:318 (菜鸟二级) | 2014-08-07 16:39

@hexllo: 这个没研究过,建议你先研究一下,或者另开一个博问让大家讨论

dudu | 园豆:30585 (高人七级) | 2014-08-08 10:49

@dudu: 这个我后来发现不满足我的要求,比如a=abcd,b=cdab,最终还是abcd,不考虑顺序的...只是找出两个字符中,都同时存在的字符..-_-!

hexllo | 园豆:318 (菜鸟二级) | 2014-08-08 15:57
其他回答(2)
0

给个例子出来呀

Yu | 园豆:12990 (专家六级) | 2014-08-05 11:36
0

最长公共子串有标准算法的,随便搜下就有了,比如这个 http://www.cnblogs.com/dartagnan/archive/2011/10/06/2199764.html

收获园豆:1
水牛刀刀 | 园豆:6350 (大侠五级) | 2014-08-05 11:47

哥们,你推荐的这帖子是个好帖子,就是有点深奥,表示看不懂啊..

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2014-08-07 16:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册