using System.Collections.Generic;
public class PatternCount
public string Pattern { get; set; }
public int Count { get; set; }
public class PatternFinder
public static IEnumerable<string> GetChunks(string input, int size)
for(int i = 0; i + size <= input.Length; i++)
yield return input.Substring(i, size);
public static List<PatternCount> FilterAndCountPatterns(string input, int patternLength, int minMatchCount)
throw new ArgumentOutOfRangeException(String.Format("Expected Pattern should be greater than 0 but got {0} here.", patternLength));
if(input == null || input.Length == 0)
throw new ArgumentException("Expected input string cannot be empty.");
var patternQuery = from pattern in GetChunks(input, patternLength)
group pattern by pattern into patternGroup
where patternGroup.Count() >= minMatchCount
select new PatternCount{ Pattern = patternGroup.Key, Count = patternGroup.Count() };
return patternQuery.ToList();
public static void Main()
Console.WriteLine("Enter a string:");
var inputString = Console.ReadLine();
Console.WriteLine("Enter Pattern Length:");
if(int.TryParse(Console.ReadLine(), out patternLength))
var results = PatternFinder.FilterAndCountPatterns(inputString, patternLength, minMatchCount);
if(results.Count() == 0){
Console.WriteLine("No patterns found with the entered input.");
Console.WriteLine(String.Format("Found the following patterns with at least {0} matches:", minMatchCount));
foreach(var item in results)
Console.WriteLine(String.Format("{0} -> {1}", item.Pattern, item.Count));
Console.WriteLine("Please enter a valid number for Pattern Length");
Console.WriteLine("Press any key to exit");