0

追加のバッファーを使用せずに文字列から重複を削除する簡単なプログラムを作成しました。これが良い解決策かどうか誰かに教えてもらえますか? 以下の解決策よりも優れた解決策が他にあるかどうかを知りたいだけです..

編集:「フォローアップ」を入力として渡すと、一意の文字列「FW UP」が返されます

    public static void removeDuplicateString(String input) {
        String value1 = input;
        String value2 = input;
        String finalValue = "";
        int count = 0;
        char char1;
        char char2;
        for (int i = 0; i < value1.length(); i++) {
            char1 = value1.charAt(i);
            for (int j = 0; j < value2.length(); j++) {
                char2 = value2.charAt(j);
                if (char1 == char2) {
                    count++;
                }
            }
            if (count > 1) {
                //System.out.println(i);
            } else {
                finalValue = finalValue + char1;
            }

            count = 0;
        }
        System.out.println(finalValue);
    }

}
4

5 に答える 5

2

このような正の先読みベースの正規表現を使用して、指定された文字列から重複する文字を削除するのはどうですか:

String nonDup = input.replaceAll("(.)(?=.*?\\1)", "");

ライブデモ: http://ideone.com/W7EaPq

于 2013-04-02T16:26:13.073 に答える
0

これを試すことができます:

public String removeDuplicateChars(String inputString) {
        if (inputString.length() <= 1 ) {
            return inputString;
        }
        if(inputString.substring(1, 2).equals(inputString.substring(0, 1)) ) {
            return removeDuplicateChars(inputString.substring(1));
        } else {
            return inputString.substring(0, 1) + removeDuplicateChars(inputString.substring(1));
        }
    }
于 2013-04-02T16:14:25.703 に答える
0

あなたのソリューションは機能します。

別の解決策:

public static void removeDuplicateString2(String input) {
    wh:
    while(true)
    {
        for(char c : input.toCharArray())
        {
            if(input.contains("" + c + c))
            {
                input = input.replaceAll("["+ c +"]" + "["+ c +"]", "");
                continue wh;
            }
        }
        break;
    }

    System.out.println(input);
}

醜いが動作します。

于 2013-04-02T16:23:02.817 に答える
0

「Mergesort」または「Quicksort」を使用できます(並べ替え中に一時的な配列を使用してデータを割り当てることができると仮定すると、そのために追加の「O(n)」スペースが必要になります)。

配列を並べ替えたら、配列を反復処理して、1 つの要素を次の要素と比較し、特定の要素が同じ要素と等しいことがわかるたびに、要素を 1 つ後ろにシフトします。

これを行うことで、次のものがあります。

  • O(N LOG N) ソートのため
  • O(N) はすべての要素を反復処理します
  • O(M) 要素を後方にシフトする

重複の数によっては、重複を消去するために要素を後方にシフトするコストがかかるため、このコードは非常に遅くなる可能性があります。

于 2016-06-23T02:10:39.027 に答える
0

これを試すことができます:

   public static void removeDuplicateString(String input) {
        char[] ch = input.toCharArray();
        char[] copy = new char[ch.length];
        char[] avoid = new char[ch.length];
        int counter = 0,count=0;
        for (int i = 0 ; i < ch.length; i++)
        {
            char cch = ch[i];
            boolean duplicate = false;
            if (input.indexOf(cch)==i && input.indexOf(cch,i+1)==-1)
            {
                for (int j = 0 ; j <=count ; j++)
                {
                    if (avoid[i]==cch)
                    {
                        duplicate = true;
                        break;
                    }
                }
                if (!duplicate)
                {
                    copy[counter] = cch;
                    counter++;
                }
            }
            else
            {
                avoid[count] = cch;
                count++;
            }
        }
        String finalString = new String(copy,0,counter);
        System.out.println(finalString);
    }
于 2013-04-02T16:16:07.923 に答える