2016-07-18 2 views
1

첫 번째 문자열에있는 두 번째 문자열에서 문자를 제거하는 프로그램을 작성했습니다. 복잡성은 BigO (n^2)가됩니다. 복잡성을 더 줄일 수 있습니까?첫 번째 문자열에있는 두 번째 문자열에서 문자 제거

public class Tmp { 

    public static void main(String[] args) { 
     String s = "halloween"; 
     String s1 = "halcyon"; 
     char[] ss = s.toCharArray(); 
     char[] ss1 = s1.toCharArray(); 

     for(int i=0;i<ss.length;i++){ 
      for(int j=0;j<ss1.length;j++){ 
       if(ss1[j] == ss[i]){ 
        ss1[j] = 'x'; //Replace the common char with x 
       } 
      } 
     } 
     System.out.println(Arrays.toString(ss1)); 
    } 
} 

OUTPUT

[x, x, x, c, y, x, x] 
+1

더 나은 결과를 위해 코드 검토에 코드를 추가 할 수 있습니다. http://codereview.stackexchange.com/ –

+0

예, 'O (n log n)'으로 줄일 수 있습니다. –

+1

string1의 모든 문자를 집합 ('O (n)')에 추가하십시오. 다음으로, string-2의 각 char에 대해 set-1에서'contains()'를 사용하고 char가 있으면 'x'로 설정하십시오. ('O (n)') – TheLostMind

답변

2
  1. 첫 번째 문자열을지도로 변환하십시오. O (N)
  2. 다른 문자열 반복 처리 단계에서지도하는 경우 문자 존재를 확인 1. O (N) + O (1)

총 시간 복잡도 = O (N)

여기에 MAP 저장을위한 공간이 추가로 필요합니다.

+0

첫 번째 문자열을 맵 O (N)로 변환합니다. 괜찮 았지만 다른 문자열을 반복하여 맵에서 확인하면 O (N)가됩니다. O (N) + O (N) – underdog

+1

두 개의 다른 루프가 있기 때문에 총 복잡도는 O (N) + O (N)가되므로 총 복잡성은 2 * O (N)가됩니다. 여기서 2는 일정하고 매우 큰 N에 대해서는 2를 무시할 수 있습니다. 따라서 최종 복잡도는 O (N)입니다. –

2
당신은 (두 번째 문자열에 중복 문자가없는 경우) HashSet의에 두 번째 문자열을 변환하도록 선택할 수 있습니다

. 그런 다음 첫 번째 문자열의 각 문자가 hashmap에 있는지 확인하고 발견되면 제거하십시오.

문자열 배열을 탐색하기위한 O (N) 복잡도와 HashSet에서 put/get의 복잡성은 거의 O (1)입니다.

+0

* first * string 지도에 표시 한 다음 두 번째 문자열에서지도에있는 문자를 제거합니다. 중복 된 문자는 그런 식으로 지원됩니다. – Andreas

1

원본 문자열의 모든 문자가 작은 문자 인 경우 크기가 26 인 부울 배열을 가질 수 있습니다. 그런 다음 원본 문자열을 처음부터 끝까지 검색하고 문자가 있으면 부울 배열을 업데이트합니다. 그런 다음 대상 문자열을 검사하고 부울 배열이 소스 배열에 있는지 여부를 확인합니다.

복잡도는 두 문자열 길이의 합과 같습니다.

+0

'문자가있는 경우'에는 복잡성 O (n)가 있습니다. 이제 총 복잡성은 O (n^2)가 될 것입니다. –

관련 문제