我需要帮助来找出逻辑:
所以,假设我有一个字符串,每当string
内部重复出现Char时,我需要用(Char
+ sequence of number
)替换它。
例如:
原始字符串:"abcdefgabfabc"
预期输出:"abcdefga2b2f2a3b3c2"
'a'出现3次,所以第一个'a'保持为'a',但第二个'a'变为'a2',第三个'a'变为'a3',同样的变为'a3'像b,b2,b3 ......
答案 0 :(得分:7)
Dictionary
个字母和每个字母的出现次数StringBuilder
以存储输出答案 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)
(Selman22,Stumblor)或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();