import java.util.*;
import java.util.stream.*;
 
 
class Solution {
    public boolean solution(String[] phoneBooks) {
        Arrays.sort(phoneBooks,(o1,o2)->o1.length()-o2.length());
        Set<Integer> phoneNumberLengthSet = new HashSet<>();
        for(String phoneNumber : phoneBooks){
            phoneNumberLengthSet.add(phoneNumber.length());
        }
        List<Integer> phoneNumberLengths = phoneNumberLengthSet.stream()
            .sorted(Comparator.naturalOrder())
            .collect(Collectors.toList());
        
        Map<String,Integer> surfixAndCount = new HashMap<>();
        for(String phoneNumber : phoneBooks){
            for(int length : phoneNumberLengths){
                if(phoneNumber.length()<length) break;
                
                String surfix = phoneNumber.substring(0, length);
                surfixAndCount.putIfAbsent(surfix, 0);
                surfixAndCount.put(surfix, surfixAndCount.get(surfix) + 1);
            }
        }
        
        for(String phoneNumber : phoneBooks){
            if(surfixAndCount.containsKey(phoneNumber) && surfixAndCount.get(phoneNumber) >= 2){
                return false;
            }
        }
        return true;
        
        
        // Set<String> surfixSet = new HashSet<>();
        // for(String phoneNumber : phoneBooks){
        //     for(int length : phoneNumberLengths){
        //         if(phoneNumber.length()<length) break;
        //         String surfix = phoneNumber.substring(0, length);
        //         if(surfixSet.contains(surfix)) return false;
        //         surfixSet.add(surfix);
        //     }
        // }
        // return true;
    }
}