Given an integer k and a string s, find the length of the longest substring that contains at most k distinct characters.
For example, given s = “abcba” and k = 2, the longest substring with k distinct characters is “bcb”.
Solution
public static String getLongestSubstringDistinct(String str, Integer k){ Integer n = str.length(); Integer left = 0; Integer right = 0; Map<Integer, Integer> mapOfChars = new Map<Integer, Integer>(); while (right < n){ if (mapOfChars.size() < k+1){ if (!mapOfChars.containsKey(str.charAt(right))){ mapOfChars.put(str.charAt(right), right); } else if (right-mapOfChars.get(str.charAt(right))<=1){ mapOfChars.put(str.charAt(right), right); } right++; } System.debug('mapOfChars > ' + mapOfChars); if (mapOfChars.size() == k+1){ List<Integer> mapOfValues = mapOfChars.values(); mapOfValues.sort(); Integer leftMax = mapOfValues.get(0); mapOfChars.remove(str.charAt(leftMax)); left = leftMax + 1; } } List<Integer> charStartEnd = mapOfChars.values(); charStartEnd.sort(); return str.subString(charStartEnd.get(0)-1, charStartEnd.get(1)); }
Testing
System.debug(getLongestSubstringDistinct('abcba', 2)); //bcb System.debug(getLongestSubstringDistinct('zxybobc', 2)); //bob