2016-11-28 12 views
0

ユーザーが入力した文字列が回文かどうかを判断するアプリケーションを作成しようとしています。ビジュアル基本回文コード

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 

1を動作していない:StrReverseで、1作業

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 

答えて

4

文字列の反転を使用しているときの動作は、文字列の上に、少なくとも2フル回を反復しているので、それが最適ではありません(文字列の逆転は文字列が.NETで不変なので文字列のコピーを作成します)(TrimReplace呼び出しの余分な繰り返し)。

しかし、パリンドロームの本質的な性質を考えてみましょう。文字列の最初の半分は、逆の文字列の後半に相当します。

回文をチェックするための最適なアルゴリズムは、入力文字列の半分だけを繰り返す必要があります。value[n]value[length-n]n = 0 to length/2と比較する必要があります。 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

クールなアルゴリズム!非常に簡潔です。私が考えなければならない点は、Integer型が.5を切り捨てて奇数長を2で割った結果、中間の余分な文字は任意の値を持つことができるため、これが奇数番号の文字列に対して機能することです。 – BobRodes

+0

@BobRodes正しいので、簡単です。 – Dai

+0

VB.Netでは '3/2'は2に丸められますが、整数の分割 '3 \ 2'は1に切り捨てられます。ビットシフトは' length >> 1'でも動作します – Slai

関連する問題