在字符串中实现重复字符删除的最快方法(C#)
在C#中,检测String中重复字符并删除它们的最快方法是什么(删除包括重复字符的第一个实例 )?
示例输入: nbHHkRvrXbvkn
输出示例: RrX
最快的代码行:
var s = "nbHHkRvrXbvkn"; var duplicates = s.Where(ch => s.Count(c => c == ch) > 1); var result = new string(s.Except(duplicates).ToArray()); // = "RrX"
最快速性能最快可能是这样的(不保留顺序):
var h1 = new HashSet(); var h2 = new HashSet (); foreach (var ch in "nbHHkRvrXbvkn") { if (!h1.Add(ch)) { h2.Add(ch); } } h1.ExceptWith(h2); // remove duplicates var chars = new char[h1.Count]; h1.CopyTo(chars); var result = new string(chars); // = "RrX"
性能测试
如有疑问 – 请测试:)
Yuriy Faktorovich的回答00:00:00.2360900 卢克回答00:00:00.2225683 我的“几行”回答00:00:00.5318395 我的“快速”回答00:00:00.1842144
这是一个非常快速的保留订单。 但我有点担心LINQ如何组和哪里:
string s = "nbHHkRvrXbvkn"; Console.WriteLine( s.ToCharArray() .GroupBy(c => c) .Where(g => g.Count() == 1) .Aggregate(new StringBuilder(), (b, g) => b.Append(g.Key)));
编辑:在某些情况下,这个比Lut更慢,但它保留了顺序
private static string MyMethod(string s) { StringBuilder sb = new StringBuilder(s.Length); foreach (var g in s.ToCharArray().GroupBy(c => c)) if (g.Count() == 1) sb.Append(g.Key); return sb.ToString(); }
这个应该很快(并保留原始顺序):
public static string RemoveDuplicates(string source) { HashSet found = new HashSet (); HashSet dupes = new HashSet (); foreach (char c in source) { if (!found.Add(c)) { dupes.Add(c); } } StringBuilder sb = new StringBuilder(source.Length); foreach (char c in source) { if (!dupes.Contains(c)) { sb.Append(c); } } return sb.ToString(); }
这保留了顺序,根据我的测试,它比使用HashSet快4倍。 假设您的角色范围是0-255,但您可以轻松扩展它。 如果你打算在循环中使用它,移动int[] c = new int[255];
out并在函数中执行一个Array.Clear(c,0,255)
。
private static string RemoveDuplicates(string s) { int[] c = new int[255]; for (int i = 0; i < s.Length; i++) { c[s[i]]++; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.Length; i++) { if (c[s[i]] == 1) sb.Append(s[i]); } return sb.ToString(); }
该算法是通用的,可以应用于任何语言
上述就是C#学习教程:在字符串中实现重复字符删除的最快方法(C#)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
- 创建一个映射(HashTable)char-> int,它保存找到的每个字符的计数,最初为空
- 扫描字符串一次以填充地图。
- 创建一个新的空字符串,它将保存输出,可能你需要使用StringBuilder。
- 扫描字符串(或映射,以较短者为准)仅将出现1的字符复制到输出字符串/ StringBuilder
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1005655.html