【问题标题】:Removing matching characters between two strings删除两个字符串之间的匹配字符
【发布时间】:2013-07-17 01:44:19
【问题描述】:

我想删除两个给定字符串之间匹配的字符。例如。

string str1 = "Abbbccd";
string str2 = "Ebbd";

从这两个字符串中,我希望输出为:

"Abcc",只有那些存在于 str2 中的匹配字符应该从 str1 中删除。

我尝试了以下代码:

   public string Sub(string str1, string str2)
   {
       char[] arr1 = str1.ToCharArray();
       char[] arr2 = str2.ToCharArray();

       char[] arrDifference = arr1.Except(arr2).ToArray();
       string final = new string(arrDifference);

       return final;
   }

使用此代码,我得到的输出为"Ac"。它会删除两个数组之间的所有匹配字符,并且只存储一次“c”。

【问题讨论】:

    标签: c# asp.net arrays string


    【解决方案1】:

    首先创建这个辅助方法:

    IEnumerable<Tuple<char, int>> IndexDistinct(IEnumerable<char> source)
    {
        var D = new Dictionary<char, int>();
        foreach (var c in source)
        {
            D[c] = D.ContainsKey(c) ? (D[c] + 1) : 0;
            yield return Tuple.Create(c, D[c]);
        }
    }
    

    它将字符串“aabcccd”转换为[(a,0),(a,1),(b,0),(c,0),(c,1),(c,2),(d ,0)]。这个想法是通过在相等的字符上添加一个计数索引来使每个字符都不同。

    然后像这样修改你提议的函数:

    string Sub(string str1, string str2)
    {
        return new string(
            IndexDistinct(str1)
                .Except(IndexDistinct(str2))
                .Select(x => x.Item1)
                .ToArray());
    }
    

    现在您在Tuple&lt;char, int&gt; 上执行Except 而不仅仅是char,您应该会得到您指定的行为。

    【讨论】:

    • 非常感谢您的回答。我要试试这个。
    【解决方案2】:

    你也可以用列表来做:

        List<char> one = new List<char>("Abbbccd".ToCharArray());
        List<char> two =  new List<char>("Ebbd".ToCharArray());
        foreach (char c in two) {
            try { one.RemoveAt(one.IndexOf(c)); } catch { }
        }
        string result = new string(one.ToArray());
    

    【讨论】:

      【解决方案3】:

      使用 C# 的字符串命令来修改字符串。

          public string testmethod(string str1, string str2)
          {
              string result = str1;
              foreach (char character in str2.ToCharArray())
              {
                  result = result.Replace(character.ToString(), "");
              }
      
              return result;
          }
      

      【讨论】:

      • 感谢您的意见。我尝试了这段代码,它解决了我的一个问题,并将“c”存储为预期的两倍,但它删除了所有“b”并将输出作为“Acc”而不是“Abcc”。 :)
      • 啊,位置很重要。好吧,这将改变实施。很抱歉错过了那个细节。我会修改它。
      猜你喜欢
      • 2010-12-25
      • 2016-07-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多