2017-02-12 5 views
-1

1つの文字列が別の文字列を置換できるかどうかを示すブール値を返す次のコードがあります。 仮定は、我々はASCII文字を使用していることは、次の2つの文字列を渡す場合、出力は のSystem.out.println(checkPermutation(「犬」、「ODF」))まだ本当である文字配列を使用しているときに、パーミュテーションチェッカーの出力が正しくない

を設定することです。

何が欠けていますか?

public static boolean checkPermutation(String s1, String s2) { 

    if(s1.length() != s2.length()) { 
     return false; 
    } 

    char[] letters = new char[128]; 
    for(char c : s1.toCharArray()) { 
     letters[c]++; 
    } 

    for(int i = 0; i < s2.length(); i++) { 
     int c = (int) s2.charAt(i); 
     letters[c]--; 
     if(letters[c] < 0) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

@NimitPatel:Java配列の要素(クラスとインスタンスフィールド)は常に 'char'がある' '\ u0000''にHTTPSを参照適切なゼロに初期化されています://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.5 –

答えて

0

アイデアを伝えるだけです。

for (int i = 0; i < s2.length(); i++) { 
    if (s1.indexOf(s2.charAt(i)) == -1) { 
     return false; 
    } 
} 
0
あなたの問題は発生のカウントではなく、整数の配列を格納する文字の配列を使用しているように見える

(I:文字が両方の文字列に存在している場合は、検索した文字列のindexOf方法を使用することができますletters[c]は、charがゼロより小さくなることができないため、ゼロより小さくなることはないと推測しています)。私はあなたのコードを修正し、これは動作するはずです:

public static boolean checkPermutation(String s1, String s2) { 

    if(s1.length() != s2.length()) { 
     return false; 
    } 

    int [] letters = new int[128]; 
    for(char c : s1.toCharArray()) { 
     letters[c]++; 
    } 

    for(int i = 0; i < s2.length(); i++) { 
     int c = (int) s2.charAt(i); 
     letters[c]--; 
     if(letters[c] < 0) { 
     return false; 
     } 
    } 
    return true; 
} 
+0

特に(Java) 'char'は符号なしですので、'(char)0'をデクリメントします'<'は65535に変換され、 '<0 'ではない文字' \ uFFFF'を返します –

関連する問題