2016-10-13 28 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削除よりも、元の文字列のコピーを作成し、既に存在するものをスキップする以外は、文字を1つずつ追加することを考えてください。 '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コレクション、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

はこのJava 8ですか? –

+0

@ScaryWombatはい。 – 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

@ScaryWombat 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(); 
}