VB.NET - Code Samples - Permutation Code
VB.NET Permutation Algorithm
Synopsis:
Used to create all the permutations or unique arrangements of a given set of letters e.g.("cat","cta","atc","act","tca","tac")
The Reason:
Initially I needed a permutation algorithm to create all the possible combinations of letters so I could unscramble words. Most of the code samples I found involved recursion which seemed to be a memory hog and crashed my application quite frequently. I finally found some code that utilized a transposition matrix. The code was written in VB 6 by Ziad Cassim. I based my code on this aiming for readablity over efficiency. Most of my logic though was more directly pulled from the information on how to create the matrix. Go here for more information.
The Code:
Private Function Permutations(ByVal data As String) As String(,) Dim i As Int32 Dim y As Int32 Dim x As Int32 Dim tempChar As String Dim newString As String Dim strings(,) As String Dim rowCount As Long If data.Length < 2 Then Exit Function End If 'use the factorial function to determine the number of rows needed 'because redim preserve is slow ReDim strings(data.Length - 1, Factorial(data.Length - 1) - 1) strings(0, 0) = data 'swap each character(I) from the second postion to the second to last position For i = 1 To (data.Length - 2) 'for each of the already created numbers For y = 0 To rowCount 'do swaps for the character(I) with each of the characters to the right For x = data.Length To i + 2 Step -1 tempChar = strings(0, y).Substring(i, 1) newString = strings(0, y) Mid(newString, i + 1, 1) = newString.Substring(x - 1, 1) Mid(newString, x, 1) = tempChar rowCount = rowCount + 1 strings(0, rowCount) = newString Next Next Next 'Shift Characters 'for each empty column For i = 1 To data.Length - 1 'move the shift character over one For x = 0 To strings.GetUpperBound(1) strings(i, x) = strings(i - 1, x) Mid(strings(i, x), i, 1) = strings(i - 1, x).Substring(i, 1) Mid(strings(i, x), i + 1, 1) = strings(i - 1, x).Substring(i - 1, 1) Next Next Return strings End Function Public Function Factorial(ByVal Number As Integer) As String Try If Number = 0 Then Return 1 Else Return Number * Factorial(Number - 1) End If Catch ex As Exception Return ex.Message End Try End Function