将重复的char替换为字符串中的其他内容

我需要帮助来找出一个逻辑:

所以,假设我有一个字符串,每当在该string重复出现Char时,我需要将其替换为( Char + sequence of number )。

例如:

原始字符串: "abcdefgabfabc"

预期输出: "abcdefga2b2f2a3b3c2"

‘a’出现3次,所以第一个’a’仍为’a’,但第二个’a’变为’a2’,第三个’a’变为’a3’,同样的变为’b’等其他字符, b2,b3 ……

 var str = "abcdefgabfabc"; var chars = str.Select((c, index) => { int count = str.Substring(0, index).Count(x => c == x); if (count > 0) return c.ToString() + (count+1); else return c.ToString(); }).SelectMany(c => c).ToArray(); var result = new string(chars); // abcdefga2b2f2a3b3c2 
  1. 创建字母Dictionary和每个字母的出现次数
  2. 创建一个StringBuilder来存储输出
  3. 逐字循环输入字符串
  4. 将字母输出到新字符串
  5. 如果字母不在字典中,请将其添加为键,并以“1”作为值
  6. 如果字母已经在字典中,请将值增加1并将值附加到输出字符串

试试这个:

 var foundChars = new SortedDictionary(); var stringBuilder = new StringBuilder(); foreach (var c in originalString) { var count = 0; if (!foundChars.TryGetValue(c, out count) { foundChars.Add(c, 1); } else { count += 1; foundChars[c] = count; } stringBuilder.Append(c); if (count > 0) stringBuilder.Append(count); } 

请注意,虽然不太漂亮,但它比基于LINQ的解决方案更具性能,并且与.NET 2.0具有后向兼容性。

我会使用LINQ迭代每个字符,然后保持你在路上遇到的每个字符的计数器。

例如..

 var count = new Dictionary(); var string = "abcdefabcdef"; var result = ""; string.Select().Each(c => { if (count.ContainsKey(c)) count.Add(c, 1); else count[c]++; result += count[c] > 1? c + count[c] : c; }); 

一些其他答案的缺点是O(n^2) ( Selman22 , Stumblor )或O(n*log n) ( Chrono1981 ),即使O(n)解决方案很简单。 正确的解决方案正是D Stanley和我所暗示的。 它来了:

 var input = "abcdefgabfabc"; var counts = new Dictionary(); var sb = new StringBuilder(); foreach (var c in input) { int count; counts.TryGetValue(c, out count); // If "counts" doesn't have the key, then count will be 0 counts[c] = ++count; sb.Append(c); if (count > 1) sb.Append(count); } var result = sb.ToString();