using System.Collections.Generic;
public static void Main()
Console.WriteLine(FindSubstring("abbabbaccaaddaakk", 4));
public static string FindSubstring(string input, int requiredNumUniqueChars)
if (string.IsNullOrWhiteSpace(input) || input.Length < requiredNumUniqueChars)
var uniqueCharsFound = new Dictionary<char, int>();
int resultStartIndex = 0;
while (endIndex < input.Length)
if (IsUniqueChar(input[endIndex], uniqueCharsFound, requiredNumUniqueChars))
AddChar(input[endIndex], uniqueCharsFound);
if (uniqueCharsFound.Count == requiredNumUniqueChars
&& (resultEndIndex - resultStartIndex) < (endIndex - 1 - startIndex))
resultStartIndex = startIndex;
resultEndIndex = endIndex - 1;
RemoveChar(input[startIndex], uniqueCharsFound);
if (uniqueCharsFound.Count < requiredNumUniqueChars)
if (endIndex == input.Length)
if ((resultEndIndex - resultStartIndex) < (endIndex - startIndex))
return input.Substring(startIndex, endIndex - startIndex + 1);
return input.Substring(resultStartIndex, resultEndIndex - resultStartIndex + 1);
public static bool IsUniqueChar(char input, Dictionary<char, int> uniqueCharsFound, int requiredNumUniqueChars)
return (!uniqueCharsFound.ContainsKey(input))
? uniqueCharsFound.Count < requiredNumUniqueChars
public static void AddChar(char input, Dictionary<char, int> uniqueCharsFound)
if (!uniqueCharsFound.ContainsKey(input))
uniqueCharsFound[input] = 1;
uniqueCharsFound[input] = uniqueCharsFound[input] + 1;
public static void RemoveChar(char input, Dictionary<char, int> uniqueCharsFound)
if (!uniqueCharsFound.ContainsKey(input))
if (uniqueCharsFound[input] == 1)
uniqueCharsFound.Remove(input);
uniqueCharsFound[input] = uniqueCharsFound[input] - 1;