Sherlock and the Valid String

  • + 0 comments

    Java Solution

        public static String isValid(String s) {
            // Write your code here
            HashMap<Character, Integer> letterCountMap = new HashMap<>();
            HashMap<Integer, Integer> occMap = new HashMap<>();
            
            // count letter
            for(Character ch : s.toCharArray()) {
                letterCountMap.put(ch, letterCountMap.getOrDefault(ch, 0)+1);
            }
            
            // count of occurences of the occurences of the letter
            for(Map.Entry<Character, Integer> entry : letterCountMap.entrySet()) {
                occMap.put(entry.getValue(), occMap.getOrDefault(entry.getValue(), 0)+1);
            }
            // if all equal
            if (occMap.size() == 1)
                return "YES";
                
            // find largest count & smallest count
            // don't really need to keep track of smallest & largest
            // only need to store the 2 key value into variable for comparing later
            int largest_key = Integer.MIN_VALUE;
            int smallest_key = Integer.MAX_VALUE;
            int largest_value = 0;
            int smallest_value = 0;
            for(Map.Entry<Integer, Integer> entry : occMap.entrySet()) {
                if (entry.getValue() > largest_key) {
                    largest_key = entry.getKey();
                    largest_value = entry.getValue();
                }
                if (entry.getValue() < smallest_key) {
                    smallest_key = entry.getKey();
                    smallest_value = entry.getValue();
                }
            }
            
            // System.out.println("count map: " + letterCountMap);
            // System.out.println("occ map: " + occMap);
            // System.out.println("largest: " + largest_key);
            // System.out.println("smallest: " + smallest_key);
    
            if (occMap.size() == 2) {
                if (occMap.get(smallest_key) == 1 || occMap.get(largest_key) == 1) 
                    if (smallest_key == 1 || largest_key == 1)
                        return "YES";
                    else if (Math.abs(smallest_key-largest_key) == 1)
                        return "YES";
            }
                
            return "NO";
        }