2017-06-10 12 views
-1
String str="cat"; 
char[] arr = new char[26]; 
for(int i=0; i<str.length(); i++){ 
    arr[str.charAt(i)-'a']++; 
} 
String ns = new String(arr); 

私はこのコードを見つけました。私の疑問は、配列がarr [str.charAt(i) - 'a'] ++;)演算を行うデフォルトで\ u0000を含んでいることです。そして、このarrをどのようにして非常に多くのヌル値を持つ文字列nsに変換できますか?完全なコードのリンクを共有します。コードは正常に動作しています。 http://www.programcreek.com/2014/04/leetcode-anagrams-java/文字列java anagrams

+2

[Javaで配列のデフォルトの初期化とは何ですか?](https://stackoverflow.com/questions/3426843/what-is-the-default-initialization-of-an-array-in- java) – BackSlash

+0

それは私が提供したリンクを見たaz – Bohemian

答えて

0

コードでは、入力文字列の文字数をchar[]に数えます。 int[]の代わりに これは、直観に反する音です。 しかし、これはいくつかの制限がある効率的な解決策につながります。

トリックは、あなたがchar[]、 からかなり効率的Stringを作成することができますし、それはあなたのString.equalsの恩恵を与えることです。 文字の頻度を含むchar[]から作成された文字列は、読みやすいものではありませんが、それは問題ではありません。 このような文字列は、 のリンクコードと同様に、 となります。String.equalsには、ハッシュテーブルでの使用に適した実装があるためです。対照的に、int[]は、equalsの有用な実装を有していない。 配列はequalsの実装をObject、 から継承しているためあまり役に立ちません。 の両方が同じ値を含んでいても、a.equals(b)falseを返します。 abchar[]a != bですが、彼らは同じ値が含まれている場合String.equalsnew String(a).equals(new String(b))へ おかげでtrueを返します。 さらに、int[]を、new String(char[])より速いハッシュマップで使用するのに適したものに変換する方法はありません。

strに65535回以上出現する文字が含まれる場合、アルゴリズムは正しい出力を生成しないという制限があります。

+0

の範囲の文字の 'Map 'のハックな圧縮です。読み込み可能な文字列としてnsを変換するのではありませんが、ハッシュマップはうまく構築されており、その中に存在する値を印刷することで表示できます。それは私が「うまく働いている」ことを意味するものです – beginner

+0

あなたは正しいです、私は今リンクされたページを読んで、私の答えを書き換えました – janos