2016-04-24 72 views
3

有名な "Coding Interview"を読んで始めました。Javaの文字列の重複文字を削除する

追加のバッファを使用せずに文字列内の重複文字を削除するアルゴリズムを設計し、コードを書き込んでください。 注:1つまたは2つの追加変数が問題ありません。 配列の余分なコピーはありません。

私はここで同様のトピックを見つけました:ここでの問題は、著者は、このための引数であることを、配列を使用したことである

public static void removeDuplicates(char[] str) { 
    if (str == null) return; 
    int len = str.length; 
    if (len < 2) return; 

    int tail = 1; 

    for (int i = 1; i < len; ++i) { 
     int j; 

     for (j = 0; j < tail; ++j) { 
     if (str[i] == str[j]) break; 
     } 

     if (j == tail) { 
     str[tail] = str[i]; 
     ++tail; 
    } 
    } 
    str[tail] = 0; 
} 

:著者によって与えられたRemove the duplicate characters in a string

ソリューションは、ということでした関数。だから私の質問です:どのようにSTRINGを引数としてアルゴリズムを書くことができますか?私は実際にここで配列を使用する方が簡単だと感じたので、エクササイズの難しさを避けるような感じです(私の意見では、私は新しくJava開発者です)。

どのようにこのようなアルゴリズムを書くことができますか?

+0

質問者のために、あなたがそれらから文字を削除する可能性が言う、の文字列は変更可能だったと仮定してみましょう:あなたは、配列を使用するとあなたはその位置に同じ文字を取得するためにString.charAt(位置)を使用することができます[ポジション]。 – Vucko

答えて

3

Java文字列は不変なので、配列をバッファにコピーせずに文字列を使用することはできません。

+0

これを追加する... 'str [tail] = str [i]'は配列を必要とするステートメントです。 –

0

Stringを使用する場合は、重複していないstrを表すメソッドからStringを返す必要があります。それはルールに反するかどうかはわかりませんが、ここで私がStringの問題を解決する方法です:

文字列内の各文字について、私はその文字で文字列を分割します。私はその文字のすべてのインスタンスを後者の部分文字列から削除します。私はその後、文字がまだその場所に保持されていることを確認し、修正後者の部分文字列と元の部分文字列を連結します。このような何か:

public static String removeDuplicates(String str) { 
    if(str == null || str.length() < 2) 
     return str; 
    String temp; 
    for(int x = 0; x + 1 < str.length(); x++) { 
     temp = str.charAt(x) + ""; 
     str = str.substring(0, x) + temp + str.substring(x + 1).replaceAll(temp, ""); 
    } 
    return str; 
} 
関連する問題