计算连续相等字符的数量

时间:2016-09-20 10:13:27

标签: c# string linq

我需要验证序列号,其中一条规则是允许最多5个连续的相等字符。

示例有效:

012W212222123 // 4x the digit 2 contiguous 

示例无效:

012W764444443 // 6x the digit 4

所以我试图获得最大数量的连续字符而没有成功

int maxCount = "012W764444443".GroupBy(x => x).Max().Count();

3 个答案:

答案 0 :(得分:4)

我建议使用正则表达式检查是否有5个或更多连续数字:

Regex.IsMatch(input, @"^(?!.*([0-9])\1{4})")

如果有任何字符:

Regex.IsMatch(input, @"^(?!.*(.)\1{4})")

请参阅regex demo

正则表达式在字符串中找到匹配项,该字符串包含少于5个相同的连续数字(带有[0-9]的版本)或除换行符之外的任何字符(带有.的版本)。

<强>详情:

  • ^ - 字符串的开头 - (?!.*(.)\1{4}) - 如果匹配模式,则会导致匹配失败的否定前瞻:
    • .* - 除换行符之外的任何0 +字符
    • (.) - 第1组捕获任何字符但是换行符
    • \1{4} - 恰好4个连续出现在第1组中的相同值(其中\1backreference{4}是一个range/bound/limiting quantifier)。

C#

var strs = new List<string> { "012W212222123", "012W764444443"};
    foreach (var s in strs)
        Console.WriteLine("{0}: {1}", s, Regex.IsMatch(s, @"^(?!.*(.)\1{4})"));

答案 1 :(得分:2)

另一种选择是使用此功能:

public static int MaxNumberOfConsecutiveCharacters(string s)
{
    if (s == null) throw new ArgumentNullException(nameof(s));

    if (s.Length == 0) return 0;

    int maxCount = 1;
    int count = 1;

    for (int i = 1; i < s.Length; i++)
    {
        if (s[i] == s[i-1])
        {
            count++;
            if (count > maxCount) maxCount = count;
        }
        else
        {
            count = 1;
        }
    }

    return maxCount;
}

显然,这比正则表达式要多得多。根据您对正则表达式的了解,这可能会或可能不会对您更具可读性。此外,这可能比使用正则表达式更有效,正则表达式可能对您很重要,也可能不重要。

答案 2 :(得分:2)

效率有点低,但这很有效:

var max = 
    "012W212222123"
        .Aggregate(
            new { Char = ' ', Count = 0, Max = 0 },
            (a, c) =>
                a.Char == c
                    ? new { Char = c, Count = a.Count + 1, Max = a.Max > a.Count + 1 ? a.Max : a.Count + 1 }
                    : new { Char = c, Count = 1, Max = a.Max > 1 ? a.Max : 1 })
        .Max;

我尝试了两个输入并且每次都获得了正确数量的最大重复次数。