2016-11-28 3 views
0

Ich versuche, eine Anwendung zu erstellen, die bestimmen wird, ob eine vom Benutzer eingegebene Zeichenfolge ein Palindrom ist oder nicht.Visual Basic Palindrom Code

Ist es möglich, ohne StrReverse, möglicherweise mit für nächste Schleife. Das habe ich bisher gemacht.

Arbeiten ein, mit StrReverse:

Dim userInput As String = Me.txtbx1.Text.Trim.Replace(" ", "") 
    Dim toBeComparedWith As String = StrReverse(userInput) 

    Select Case String.Compare(userInput, toBeComparedWith, True) 

     Case 0 
      Me.lbl2.Text = "The following string is a palindrom" 
     Case Else 
      Me.lbl2.Text = "The following string is not a palindrom" 

    End Select 

Nicht einem einzigen Arbeits:

Dim input As String = TextBox1.Text.Trim.Replace(" ", "") 
    Dim pallindromeChecker As String = input 
    Dim output As String 

    For counter As Integer = input To pallindromeChecker Step -1 

     output = pallindromeChecker 

    Next counter 

    output = pallindromeChecker 

    If output = input Then 
     Me.Label1.Text = "output" 
    Else 
     Me.Label1.Text = "hi" 
    End If 

Antwort

4

Während String Umkehr mit arbeitet, ist es nicht optimal, weil Sie über die Zeichenfolge sind Iterieren mindestens 2 volle mal (als String-Umkehrung erstellt eine Kopie einer Zeichenfolge, da Zeichenfolgen in .NET unveränderlich sind) (plus zusätzliche Iterationen für Ihre Aufrufe Trim und Replace).

Beachten Sie jedoch die wesentlichen Eigenschaften eines Palindroms: Die erste Hälfte einer Zeichenkette entspricht der zweiten Hälfte der Zeichenkette in umgekehrter Reihenfolge.

Der optimale Algorithmus zum Überprüfen eines Palindroms muss nur die Hälfte der Eingabezeichenfolge durchlaufen - indem value[n] mit value[length-n] für n = 0 to length/2 verglichen wird.

In VB.NET:

Public Shared Function IsPalindrome(String value) As Boolean 

    ' Input validation. 
    If value Is Nothing Then Throw New ArgumentNullException("value") 
    value = value.Replace(" ", "") 

    Dim length As Integer = value.Length 
    ' Shortcut case if the input string is empty. 
    If length = 0 Then Return False ' or True, depends on your preference 

    ' Only need to iterate until half of the string length. 
    ' Note that integer division results in a truncated value, e.g. (5/2 = 2)... 
    '... so this ignores the middle character if the string is an odd-number of characters long. 
    Dim max As Integer = length - 1 
    For i As Integer = 0 To length/2 

     If value(i) <> value(max-i) Then 
      ' Shortcut: we can abort on the first mismatched character we encounter, no need to check further. 
      Return False 
     End If 

    Next i 

    ' All "opposite" characters are equal, so return True. 
    Return True 

End Function 
+0

Cooler Algorithmus! Sehr kurz. Ein Punkt, den ich durchdenken musste, ist, dass dies für ungerade Strings funktioniert, weil der Integer-Typ die .5 schneidet, was zur Folge hat, dass eine ungerade Länge durch 2 geteilt wird, und das zusätzliche Zeichen in der Mitte kann einen beliebigen Wert haben. – BobRodes

+0

@BobRodes Richtig, deshalb ist es einfacher. – Dai

+0

In VB.Net wird '3/2' auf 2 gerundet, aber die Ganzzahldivision' 3 \ 2' wird auf 1 gekürzt. Bitshift funktioniert auch 'length >> 1' – Slai