2016-06-17 7 views
1

私は回文である文字列のすべての部分文字列を見つけることに問題がありました。入力は常に1ワードです。テスト入力はaabaaでした。私は賢明にしようとし、私の部分文字列の文字列バッファを作成し、String.equalsを使ってオリジナルと比較する逆のメソッドを使用することにしました。それはうまくいかなかった。jvm StringとStringBuffer.reverse()との比較が常に失敗する

import java.util.* 

fun main(args: Array<String>) { 
    val scan = Scanner(System.`in`) 
    val input = scan.next() 

    val found = ArrayList<String>() 

    for (i in 0..input.length - 1) { 
     for (j in 0..input.length - i) { 
      val sub = input.substring(i, i + j) 

      if (!found.contains(sub)) { 
       // println(sub) 
       found.add(sub) 
       val rev = StringBuffer(sub).reverse() 

       if (sub.equals(rev)) { 
        println(rev) 
       } 
      } 
     } 
    } 
} 

私は文が真の解決はありませんし、私は「ドンのであれば、私は正しい部分文字列を取得しますが、最後の午前

a 
aa 
aab 
aaba 
aabaa 
ab 
aba 
abaa 
b 
ba 
baa 

aabaaテスト入力を使用して、最初のprint文にこのような出力を見てコメントを解除なぜこれがあるのか​​知りません。

答えて

5

subは文字列です。 revはStringBufferです。彼らは同じタイプでもないので、平等にすることはできません。

その他の注意事項:

  • はStringBufferのを使用しないでください。 StringBuilderを使用します。 StringBufferは不必要に同期されているので、もう使用しないでください(Vectorを使用しないで、ArrayListを代わりに使用する必要があります)。 1、およびjは長さになります - - 1、そしてあなたは、このようにかかる2つのループの終わりに、私は長さになります:
  • for (i in 0..input.length - 1)
  • input.substring(i, i + j)が正しいことができない、より洗練されfor (i in 0 until input.length)を書き込むことができますlength - 1〜2 * length - 2の部分文字列。
  • 独自の結果を格納するには、ArrayListではなくHashSetを使用します。 HashSetのcontains()の呼び出しはO(1)ですが、ArrayListのO(n)です。
  • をJavaとは異なり、a == bを使用して、aとbが参照であっても、aがbに等しいかどうかをテストできます。
+0

私はtoStringを見つけられませんでした。アドバイスをいただきありがとうございます。 –

+0

'Set'を使うと(示唆したように)' if(!found.contains(sub)){found.add(sub);}のようなダブルルックアップは必要ありません。 ...} 'if(found.add(sub)){...}'を使うことができます。さらに、内容を比較する場合は、 'toString()'を挿入する必要はありません。 ['sub.contentEquals(rev)'](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#contentEquals-java.lang.CharSequence-)を使用してください。あなたはそれを印刷したいだけで、2つのオブジェクトが等しい場合にのみ 'if(sub.contentEquals(StringBuffer(sub).reverse())){println(sub);}を使うことができます。 } ' – Holger

関連する問題