在字符串中查找重复的子字符串

时间:2020-07-09 21:21:58

标签: c#

我有一个子串

string subString = "ABC"; 

每当所有三个字符出现在输入中时,您都会得到1分

例如,如果输入为:

"AABKM" = 0分
"AAKLMBDC" = 1分
"ABCC" = 1点,因为这三个都发生一次
"AAZBBCC" = 2分,因为ABC重复了两次;
等。

我唯一能想到的解决方案是

Regex.Matches(input, "[ABC]").Count

但是没有给我我想要的东西。

谢谢

3 个答案:

答案 0 :(得分:5)

您可以使用三元运算,首先我们确定所有字符都出现在字符串中(否则我们返回0),然后仅选择这些字符,按每个字符分组,并返回最小值从组中计数:

例如:

string subString = "ABC";
var inputStrings = new[] {"AABKM", "AAKLMBDC", "ABCC", "AAZBBCC"};

foreach (var input in inputStrings)
{
    var result = subString.All(input.Contains)
        ? input
            .Where(subString.Contains)
            .GroupBy(c => c)
            .Min(g => g.Count())
        : 0;

    Console.WriteLine($"{input}: {result}");
}

输出

enter image description here

答案 1 :(得分:2)

可以使用Linq在一行中完成。但是我对这可能是一个很好的解决方案不是很有信心

string subString = "ABC"; 
string input = "AAZBBBCCC";

var arr = input.ToCharArray()
               .Where(x => subString.Contains(x))
               .GroupBy(x => x)
               .OrderBy(a => a.Count())
               .First()
               .Count();

结果是2,因为字母A仅出现两次。

让我们尝试解释linq表达式。 首先按字符序列转换输入字符串,然后仅获取子字符串中包含的字符。现在将这些字符分组并根据出现的次数对其进行排序。此时,进入第一个组并读取该组中的字符数。

让我们看看是否有人有更好的解决方案。

答案 2 :(得分:1)

尝试此代码:

 string subString = "ABC";
        var input = new[] { "AABKM", "AAKLMBDC", "ABCC", "AAZBBCC" };

        foreach (var item in input)
        {
            List<int> a = new List<int>();
            for (int i = 0; i < subString.Length; i++)
            {
                a.Add(Regex.Matches(item, subString.ToList()[i].ToString()).Count);
            }
            Console.WriteLine($"{item} : {a.Min()}");
        }