2016-10-13 3 views
1

문제는 원래 문자열에서 중복 문자를 삭제하고 새 문자열을 반환하는 메서드를 작성하라고합니다. 예를 들어, 원래 문자열은 abracadabra이고 결과는 abrcd 여야합니다.문자열에서 중복 문자를 삭제하는 방법

StringBuilder를 사용하여 문자를 삭제하려고했지만 코드를 실행하려고 할 때 문제가 발생했습니다. 아무도 내가 그것을 고칠 수 있습니다.

public static String eliminateDuplicates(String str){ 
    String result = ""; 
    StringBuilder strings = new StringBuilder(str); 
    for(int i = 0; i<str.length(); i++){ 
     for(int j = 1; j<str.length();j++){ 
      if(str.charAt(i)==str.charAt(j)){ 
       strings.deleteCharAt(j); 
      } 
     } 
    } 
    result = strings.toString(); 
    return result; 
} 
+0

변경했을 뭔가를 시도 그것을 반복하는 것은 항상 재앙을위한 조리법입니다 ... –

+0

Rath 어쨌든, 삭제하는 것보다, 이미있는 문자열을 건너 뛰는 것을 제외하고, 원래 문자열의 사본을 작성하고, 하나씩 문자를 추가하는 것과 관련하여 생각하십시오. 'StringBuilder'는 문자를 찾는 아주 좋은 방법을 제공하지 않으므로,'Set '을 사용하여 거기에있는 것을 추적하는 것을 고려하십시오. – Gene

답변

0

이 코드를 시도, 어쩌면 당신이 최적화 할 수 있습니다 : 당신이있는 동안

public static String eliminateDuplicates(String source) { 
    StringBuilder result = new StringBuilder(); 
    for (int i = 0, sLength = source.length(); i < sLength; i++) { 
     char readyToAdd = source.charAt(i); 
     boolean add = true; 

     for (int j = 0; j < result.length(); j++) { 
      if (readyToAdd == result.charAt(j)) { 
       add = false; 
       break; 
      } 
     } 

     if (add) result.append(readyToAdd); 
    } 

    return result.toString(); 
} 
0

해당 코드는 입력 문자열을 반복하지만 인덱스를 사용하여 문자열 작성기 객체에서 문자를 삭제합니다.

문자열 작성기가 문자를 삭제할 때마다 크기가 줄어 듭니다. 따라서 코드는 IndexOutofBoundsException으로 실패합니다. 예외의 전체 스택 추적을 질문에 추가하여 확인하십시오.

중복을 삭제하는 더 좋은 방법은 입력 문자열을 반복하여 다른 문자열을 만든 다음 고유 한 문자 만 새 문자열에 복사하는 것입니다. 그런 다음 결과로 새 문자열을 반환 할 수 있습니다.

또한이 시도 O(n*n)

+0

_O (n * m) _의 복잡도? Ehhh .... 아뇨. 그냥 _O (n) _ – Andreas

+0

Java Collections, Hashset이 사용된다면 당신은 O (n)이 될 것입니다. 나는 콜렉션을 사용하지 않고 현재의 성격과 각각의 독특한 성격을 멍청하게 비교하는 것을 지적했다. 명백히 이전의 접근법은 더 좋지만 후자는 초보자를 위해 이해하고 구현하기가 더 쉽습니다. –

1

의 시간 복잡도를 가지고 현재 코드에 비해 O(n*m)의 더 나은 시간 복잡도를해야합니다.

public static String eliminateDuplicates(String str){ 
    int[] uniq = str.codePoints().distinct().toArray(); 
    return new String(uniq, 0, uniq.length); 
} 
+0

이 자바 8인가요? –

+0

@ SkaryWombat 예. – saka1029

+0

효과가있었습니다. 하지만 당신의 코드를 이해하지 못합니다. 조금 설명 할 수 있니? 감사합니다. –

1

를 PJ의 아이디어 @ 사용

public static String eliminateDuplicates(String str) { 
    HashSet<Character> hashSet = new HashSet(); 
    //A hashSet is a collection that only adds unique elements. 

    char[] toCharArray = str.toCharArray(); 
    for (char c : toCharArray) { 
     hashSet.add(c); 
    } 

    StringBuilder answer = new StringBuilder(); 
    for (Character character : hashSet) { 
     answer.append(character); 
    } 

    return answer.toString(); 
} 
+1

'answer'를'String'보다는'StringBuilder'로 변경합니다 –

+0

@ SkaryWombat Done – HelloWorld

0

public static String eliminateDuplicates(String str){ 
    StringBuilder result = new StringBuilder(); 
    BitSet bs=new BitSet(256); 
    char[] chars=str.toCharArray(); 
    char getChar=0; 
    for(int i=0;i<chars.length;i++){ 
     getChar=chars[i]; 
     if(!bs.get(getChar)){ 
      result.append(getChar); 
      bs.set(getChar); 
     } 
    } 
    return result.toString(); 
} 
관련 문제