我有一个子串
string subString = "ABC";
每当所有三个字符出现在输入中时,您都会得到1分
例如,如果输入为:
"AABKM"
= 0分
"AAKLMBDC"
= 1分
"ABCC"
= 1点,因为这三个都发生一次
"AAZBBCC"
= 2分,因为ABC重复了两次;
等。
我唯一能想到的解决方案是
Regex.Matches(input, "[ABC]").Count
但是没有给我我想要的东西。
谢谢
答案 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}");
}
输出
答案 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()}");
}