private static Tuple <int, int> Broken2Internal(int m, char[] text, int start, int end, out int result) { if (start >= end) { result = 0; return(Tuple.Create(0, 0)); } var substring = new string(text).Substring(start, end - start + 1); var frequencyMap = new FrequencyMap(substring); //Console.WriteLine($"Count: {frequencyMap.Count}\tLength: {end - start + 1}\t'{substring}'"); if (frequencyMap.Count <= m) { result = end - start + 1; return(Tuple.Create(start, end)); } int mid = (start + end) / 2; int length1; int length2; int length3; var result1 = Broken2Internal(m, text, start, mid, out length1); var result2 = Broken2Internal(m, text, mid + 1, end, out length2); var result3 = Broken2Internal(m, text, result1.Item2 + 1, result2.Item1 - 1, out length3); var max = Math.Max(length1, Math.Max(length2, length3)); result = max; return(length1 == max ? result1 : (length2 == max ? result2 : result3)); }
private static int Broken3(int m, string text) { var frequencyMap = new FrequencyMap(); var n = text.Length; var start = 0; var end = 0; var result = 0; while (end < n) { frequencyMap.Add(text[end]); if (frequencyMap.Count <= m) { end++; continue; } result = Math.Max(result, end - start); frequencyMap.Remove(text[start++]); frequencyMap.Remove(text[end]); } return(Math.Max(result, end - start)); }