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

时间:2014-02-17 19:45:36

标签: c#

我需要帮助来找出逻辑:

所以,假设我有一个字符串,每当string内部重复出现Char时,我需要用(Char + sequence of number)替换它。

例如:

原始字符串:"abcdefgabfabc"

预期输出:"abcdefga2b2f2a3b3c2"

  
    

'a'出现3次,所以第一个'a'保持为'a',但第二个'a'变为'a2',第三个'a'变为'a3',同样的变为'a3'像b,b2,b3 ......

  

5 个答案:

答案 0 :(得分:7)

  1. 创建Dictionary个字母和每个字母的出现次数
  2. 创建StringBuilder以存储输出
  3. 逐个字母地输入输入字符串
  4. 将字母输出到新字符串
  5. 如果字母不在字典中,请将其添加为键,并以“1”作为值
  6. 如果字母已经在字典中,请将值增加1并将值附加到输出字符串

答案 1 :(得分:1)

试试这个:

var foundChars = new SortedDictionary<char, int>();
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具有逆向兼容性。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

例如......

var count = new Dictionary<string, int>();
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;
});

答案 4 :(得分:0)

其他一些答案可能会受到O(n^2)Selman22Stumblor)或O(n*log n)Chrono1981)的影响,即使是O(n)解决方案很简单。正确的解决方案实际上是D Stanley和我暗示的。在这里:

var input = "abcdefgabfabc";
var counts = new Dictionary<char, int>();

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();