算法要求很简单,就是找出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; }
这正是LINQ的用武之地:
Console.WriteLine( string.Join("", "abcde".ToCharArray() .Intersect("cdefg".ToCharArray())));
我靠,太强大了!
另外想问下,当相同字符串长度一样时,有没有什么办法?比如A中有ABCD ,B中有ABCD另外A中有XXYY,B中也有XXYY,这时,ABCD的长度和XXYY是一样的,这时有没有办法同时找出ABCD和XXYY来?
@hexllo: 这个没研究过,建议你先研究一下,或者另开一个博问让大家讨论
@dudu: 这个我后来发现不满足我的要求,比如a=abcd,b=cdab,最终还是abcd,不考虑顺序的...只是找出两个字符中,都同时存在的字符..-_-!
给个例子出来呀
最长公共子串有标准算法的,随便搜下就有了,比如这个 http://www.cnblogs.com/dartagnan/archive/2011/10/06/2199764.html
哥们,你推荐的这帖子是个好帖子,就是有点深奥,表示看不懂啊..