如何使用 C# 从字符串中删除序列中的 repeated\same 个字符?

How to remove repeated\same characters in a sequence from a string using C#?

我有一个字符串:

string  input = "aaaabbcccghbcccciippppkkllk"

输出应该是:

abcghbcipklk

注意:必须使用循环或递归。等等

只是想知道有没有比这更好更高效的代码:

    string input = "aaaabbcccghbcccciippppkkllk";
    int j=0;

    for (int i=0; i<input.Length - 1; i++) {

        for(j=i+1; j<input.Length && input[i] == input[j]; j++);

        input = input.Substring(0, i+1) + input.Substring(j); 
    }
    Console.WriteLine(input);

根据我的理解,你想要消除重复只有在连续的序列中。您可以使用以下方法实现它

使用List<string>

var nonDuplicates = new List<char>();

foreach (var element in str.ToCharArray())
{
    if(nonDuplicates.Count == 0 || nonDuplicates.Last() != element)
        nonDuplicates.Add(element);
}

var result = new string(nonDuplicates.ToArray());

更新

参考来自 的评论,我更新了答案并提供了另外两个解决方案和 运行 它们的基准。结果如下所示。

使用字符串追加

 var str = "aaaabbcccghbcccciippppkkllk";
  var strResult = string.Empty;

  foreach (var element in str.ToCharArray())
  {
     if (strResult.Length == 0 || strResult[strResult.Length - 1] != element)
        strResult = $"{strResult}{element}";
  }

使用 StringBuilder

  var str = "aaaabbcccghbcccciippppkkllk";
  var strResult = new StringBuilder();

  foreach (var element in str.ToCharArray())
  {
     if (strResult.Length == 0 || strResult[strResult.Length - 1] != element)
       strResult.Append(element);
  }
  var result = strResult.ToString();

基准测试结果

             Method |       Mean |     Error |     StdDev |     Median |
------------------- |-----------:|----------:|-----------:|-----------:|
          UsingList |   809.7 ns | 11.975 ns |  11.202 ns |   806.5 ns |
  UsingStringAppend | 1,738.0 ns | 39.269 ns | 109.467 ns | 1,697.2 ns |
 UsingStringBuilder |   201.6 ns |  1.960 ns |   1.834 ns |   201.1 ns |

如结果所示,与 List 相比,StrinbBuilder 方法要快得多。字符串追加方法最慢。

输入

aaaabbcccghbcccciippppkkllk

输出

abcghbcipklk

好的,下面是使用 "simple" 语言的方法:

string input = "aaaabbcccghbcccciippppkkllk"

var result = "" + input[0];
for(var i = 1; i < input.Length; i++)
{
    if(input[i] != result[result.Length-1])
    {
        result += input[i];
    }
}
string str = "abbxxcccxbaac";
string nstr = str[0].ToString();
               

for(int j = 0; j < str.Length - 1; j++)
{
    if(!str[j].Equals(str[j + 1]))
    {
        nstr = nstr + str[j + 1];
    }
}

它将从字符串中删除顺序字符。 nstr 是输出。