2016-06-17 8 views
1

Ich hatte ein Problem, wo ich alle Teilstrings einer Zeichenkette finden sollte, die Palindrome sind. Eingabe wäre immer 1 Wort. Die Testeingabe war Aabaa. Ich entschied mich zu versuchen, clever zu sein und einen String-Puffer meiner Teilzeichenkette zu machen, dann benutze die umgekehrte Methode, um mit dem Original zu vergleichen, indem man String.equals benutzt. Es hat nicht funktioniert.jvm String mit StringBuffer.reverse() zu vergleichen, schlägt immer fehl

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) 
       } 
      } 
     } 
    } 
} 

Als ich Kommentar- die erste print-Anweisung die Ausgabe aussieht wie dieser mit Testeingang aabaa

a 
aa 
aab 
aaba 
aabaa 
ab 
aba 
abaa 
b 
ba 
baa 

So bin ich den richtigen Teil bekommen, aber die letzten if-Anweisung nie wahr löst und I don‘ Ich weiß, warum das so ist.

Antwort

5

sub ist ein String. rev ist ein StringBuffer. Sie können nicht gleich sein, da sie nicht einmal den gleichen Typ haben.

Zusätzliche Hinweise:

  • nicht String verwenden. Verwenden Sie StringBuilder. StringBuffer ist unnötig synchronisiert und sollte nicht mehr verwendet werden (genauso wie Vector nicht verwendet werden sollte und stattdessen ArrayList).
  • for (i in 0..input.length - 1) kann for (i in 0 until input.length) geschrieben werden, die
  • input.substring(i, i + j) eleganter ist, kann nicht richtig sein: am Ende der beiden Schleifen, i lang sein würde - 1 und j lang sein würde - 1, und Sie würden also nehmen ein Teilstring zwischen Länge - 1 und 2 * Länge - 2.
  • um eindeutige Ergebnisse zu speichern, verwenden Sie ein HashSet, nicht eine ArrayList. Calling contains() auf einem HashSet ist O (1), während es auf einer ArrayList O (n) ist.
  • In Kotlin, im Gegensatz zu Java, können Sie a == b verwenden, um zu testen, ob a gleich b ist, auch wenn a und b Referenzen sind.
+0

Mir fehlte ein toString, danke für den Rat. –

+0

Beachten Sie, dass Sie, wenn Sie ein 'Set' verwenden (wie vorgeschlagen), die Doppel-Suche nicht benötigen wie' if (! Found.contains (sub)) {found.add (sub); ...} 'wie du kannst' if (found.add (sub)) {...} '. Außerdem müssen Sie kein 'toString()' einfügen, wenn Sie den Inhalt vergleichen möchten. Verwenden Sie einfach ['sub.contentEquals (rev)'] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#contentEquals-java.lang.CharSequence-). Da Sie es nur ausdrucken wollen und nur wenn die beiden Objekte gleich sind, können Sie einfach 'if (sub.contentEquals (StringBuffer (sub) .reverse())) {println (sub); } ' – Holger

Verwandte Themen