using System.Collections.Generic;
public static void Main()
string str = "zf3kabxcde224lkzf3mabxc51+crsdtzf3nab=";
PatternOccurenceFinder finder = new PatternOccurenceFinderImp1();
List<Output> patterns = finder.findPatternsOfLength(str, 3);
foreach(Output pattern in patterns) {
Console.WriteLine("Pattern: {0}\t Occurence: {1}\n",
pattern.getPattern(), pattern.getOccurences());
public interface PatternOccurenceFinder {
List<Output> findPatternsOfLength(string str, int length);
public class PatternOccurenceFinderImp1 : PatternOccurenceFinder {
public List<Output> findPatternsOfLength(string str, int length)
Dictionary<string, int> patternOccurences = new Dictionary<string, int>();
for (int i = 0; i <= str.Length - length; i++) {
string subStr = str.Substring(i, length);
if (patternOccurences.ContainsKey(subStr)) {
patternOccurences[subStr]++;
patternOccurences.Add(subStr, 1);
List<Output> patterns = new List<Output>();
foreach(KeyValuePair<string, int> patternOccurence in patternOccurences)
if (patternOccurence.Value > 1) {
Output pattern = new Output(patternOccurence.Key, patternOccurence.Value);
public class PatternOccurenceFinderImp2 : PatternOccurenceFinder {
public List<Output> findPatternsOfLength(string str, int length)
Dictionary<string, int> patternOccurences = new Dictionary<string, int>();
for (int i = 0; i <= str.Length - length; i++) {
string subStr = str.Substring(i, length);
if (!patternOccurences.ContainsKey(subStr)) {
int occurence = 1 + findPatternOccurence(subStr, str.Substring(length+i));
patternOccurences.Add(subStr, occurence);
List<Output> patterns = new List<Output>();
foreach(KeyValuePair<string, int> patternOccurence in patternOccurences)
if (patternOccurence.Value > 1) {
Output pattern = new Output(patternOccurence.Key, patternOccurence.Value);
private int findPatternOccurence(string pattern, string str) {
for (int i = 0; i <= str.Length - pattern.Length; i++) {
string subStr = str.Substring(i, pattern.Length);
if (subStr.Equals(pattern)) {
return 1 + findPatternOccurence(pattern, str.Substring(i + pattern.Length));
public Output(String pattern, int occurence) {
this.occurence = occurence;
public string getPattern() {
public int getOccurences() {