예제 #1
0
        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));
        }
예제 #2
0
        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));
        }