반복주기를 포함하는 사용의 HashMap 또는 HashSet의 최적화는 문자열 요소를 사용하여 결정

문제가 발생 원래 문자열이 항상 루프 반복 판단에 사용되는 반복 요소가 포함되어 있는지 여부를 결정,이 솔루션은 O (N- 필요합니다 . 3 방법은 몇 사이클 자체에있는 경우, 복잡성) 시간, 그것은 기하 급수적으로 증가 할 것이다 시간 복잡도. 다음 코드와 유사 :

문자열 [] A = s.split ( "" );
INT 최대 = 1 ;
위한 ( INT ; I <a.length I ++ 난 = 0 ) { 
    문자열 [] B = 새로운 문자열 [a.length - I]을; 
    B [ 0] = A [I];
    INT permax = 1 ;            
    위한 ( INT ] K <b.length를 && J <a.length, J = I + 1, K = 1 J ++, K ++ ) {
         부울 반복 = 거짓 ;
        위한 (문자열 C : b) {
             경우 (a [J]를 .equals는 (c)) { 
                반복 =  ;
            } 
        } 
        경우 (반복 == 거짓 )는 { 
            B는 [K]가 = A [J]을; 
            permax ++ ;
            경우 (permax> 최대) { 
            최대 = permax; 
            } 
        } 
        다른 
            휴식 ; 
    } 
}
루프를 사용하여 세

판정하는 빠른 방법 그것의 HashMap 또는 HashSet에 상기의 HashMap에서으로써 containsValue 사용 ()를 사용하는 것 또는에 HashSet에 포함 () 메소드를 직접 소요 시간 복잡도는 O이고, 상기 문자열 요소를 반복할지 여부를 결정할 수있다 (N- (2)는 다음과 같이), 나는의 HashMap을 사용하는 코드는 다음과 같습니다

문자열 [] A = s.split ( "" ); 
HashMap의 <정수, 문자열>지도 = 새로운 HashMap의 <> ();
INT 최대 = 1 ;
위한 ( INT ; I <a.length; 나는 0 = I ++ ) { 
    map.clear를 (); 
    map.put (I, A [I]); 
    INT permax = 1 ;            
     ( INT J = I + 1, J <a.length; J ++ ) {
         경우 (! map.containsValue (a [J])) { 
            map.put (J, A [J]); 
            permax ++ ;
            경우 (permax> 최대) { 
            최대 =permax; 
            } 
        } 
        다른 
            휴식 ; 
    } 
}

당신은 크게, 코드 실행 시간을 단축 각 사이클 이후에 매핑되는 HashMap을 모두 삭제 명확한 () 메소드를 사용하는 것을 명심 수있는 코드는 두 사이클에 사용되는 볼 수 있습니다.

추천

출처www.cnblogs.com/anthonyhoo/p/12304426.html