import java.util.*;

class Solution {
    public int[] solution(String[] gems) {
        Set<String> gemSet = new HashSet<>();
        for(String gem : gems){
            gemSet.add(gem);
        }
        int targetNumber = gemSet.size();
        Map<String, Integer> gemMap = new HashMap<>();
        
        //left는 버리기, right는 얻기 둘 다 우측방향으로 간다.
        int left = 0;
        int right = gems.length - 1;
        
        int l=0;//s
        int r=0;//e
        gemMap.put(gems[0],1);
        while(r < gems.length){//r이냐 l이냐...
            //목표 보석수 달성!
            if(gemMap.keySet().size() == targetNumber){
                //기존 길이보다 작은가?
                if(right - left + 1 > r - l + 1){
                    //기존 기준 길이보다 작다. 그러면 갱신해야지
                    right=r;
                    left=l;
                }
                
                //갱신 하든 안하든 맵을 수정한다.left가 늘어나면서 기존꺼 버린다.
                gemMap.put(gems[l], gemMap.get(gems[l]) - 1);
                if(gemMap.get(gems[l]) == 0) gemMap.remove(gems[l]);
                l++;
            }else if(r+1 < gems.length){
                //목표 달성 못했으니 더 먹어야 된다 보석을
                //그려려면 r을 우측으로 옮기자. 옮기면 맵을 갱신해준다.
                r++;
                gemMap.put(gems[r], gemMap.getOrDefault(gems[r],0) + 1);
            }else{
                break;
            }
        }
        
        return new int[]{left+1, right +1};
    }
}

//모든 보석을 하나 이상 포함하는 가장 짧은 구간을 찾아서 return 막판에 1씩 더해주기. 인덱스라서