0

重複の可能性:
Java のアナグラム アルゴリズム

    public static boolean test(String a, String b) {
    a=a.toLowerCase();
    b=b.toLowerCase();
    boolean result = true ;
    boolean tmp1=false;

    if(a.length()==b.length()){
    for(int i=0;i<a.length();i++){
        tmp1=false;
        for(int k=0;k<b.length();k++){
            if(a.charAt(i)==b.charAt(k)){



                return true;
                }

        }
        if(tmp1==false){
            result=false;
            break;
        }
        if(i==a.length()-1)
            result=true;
        }
    }

    else {
        result=false;
        }



    return result;

}

アナグラムの単語を見つけるプログラムを作りたいです。

入力が次の場合、コードは正しく機能します

  • 単語 1 は DSA です
  • 2 番目の単語は asd です
  • 出力はアナグラムです(正しい結果)

コードは入力に失敗します

  • 最初の言葉はアサです
  • 2番目の単語はアサアです
  • 結果はアナグラム (誤った結果)

私のせいは何ですか?

4

3 に答える 3

4

アルゴリズムは、単語がアナグラムであると判断するのが早すぎます。実際、最初の単語の最初の文字が 2 番目の単語の任意の文字と一致するようになるとすぐに、次のようになります。

if(a.charAt(i)==b.charAt(k)){
    return true;
}

Java でのアナグラム検出の最も簡単なアルゴリズムは次のとおりです。

  • を文字配列に変換aし、b charArrayAcharArrayB
  • ソート charArrayAしてcharArrayB
  • sortedA文字列を作成sortedBし、並べ替えられた配列から
  • 戻るsortedA.equals(sortedB)
于 2012-12-04T15:58:32.663 に答える
1

0 から 0 まで、および0からiまで実行します。したがって、両方のループ変数はそれぞれの文字列の先頭から始まります。a.length()kb.length()

さらに、内側のループではtrue、任意の時点で のいずれかの文字が の文字とb一致する場合、関数全体に対してすぐに戻りますa

于 2012-12-04T16:00:10.743 に答える
0

まず、return trueまたはなどのステートメントを使用する場合return falseは、それらを一貫して使用します ( を取り除きますboolean result)。

このアルゴリズムの問​​題は、同一の文字のペアを検出するとすぐに true を返すことです。これを修正するには、2 つの文字列を並べ替えて、すべての文字が等しいかどうかをテストすることを検討してください (ヒント:Arrays.sortString.toCharArray)。

于 2012-12-04T15:59:23.240 に答える