문제가 발생 원래 문자열이 항상 루프 반복 판단에 사용되는 반복 요소가 포함되어 있는지 여부를 결정,이 솔루션은 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을 모두 삭제 명확한 () 메소드를 사용하는 것을 명심 수있는 코드는 두 사이클에 사용되는 볼 수 있습니다.