Pattern / Combinations

  • Thread starter Thread starter Paul W Smith
  • Start date Start date
P

Paul W Smith

Does anyone know of any algorithms which produce all the possible
combinations of patterns within a string?

Example String = ABCDE

AB, AC, AD, AE, BC, BD, BE, CD, CE, DE
ABC, ABD, ABE, ACD, ACE, ADE, BCD, BCE, CDE
ABCD, ABCE, ABDE, ACDE, BDCE
ABCDE
 
A simple recursive approach seems to work quite well (though
it doesn't give them in alphabetical order):

Option Explicit
Sub main()
ShowCombinations "", "ABCDE"
End Sub

Sub ShowCombinations(strPrefix As String, strMain As String)
If strMain = "" Then
Debug.Print strPrefix
Exit Sub
End If
Dim strFirst As String, strRest As String
strFirst = Left(strMain, 1)
strRest = Mid(strMain, 2)
ShowCombinations strPrefix & strFirst, strRest
ShowCombinations strPrefix, strRest
End Sub
 
Very Nice!

--
Regards,
Tom Ogilvy


Andrew Taylor said:
A simple recursive approach seems to work quite well (though
it doesn't give them in alphabetical order):

Option Explicit
Sub main()
ShowCombinations "", "ABCDE"
End Sub

Sub ShowCombinations(strPrefix As String, strMain As String)
If strMain = "" Then
Debug.Print strPrefix
Exit Sub
End If
Dim strFirst As String, strRest As String
strFirst = Left(strMain, 1)
strRest = Mid(strMain, 2)
ShowCombinations strPrefix & strFirst, strRest
ShowCombinations strPrefix, strRest
End Sub
 
Thank you for this example which is so close to what I require - order is
unimportant.

However how do I amend your code so it only produces doubles and above, no
singles

PWS
 
The answer to my question came to me as soon as I posted my request - check
that the length of StrPrefix > 1.
 
Very Nice!
I like it also. In other math programs, this is known as "BinarySubsets."
This implementation gives it in reverse order. With 5 items, it goes from
2^5-1 to 1 in Binary form. Other programs use this idea for implementation.
First number is 31, or 11111 in binary, (abcde)
Second number is 30, or 11110 (abcd)
29, 11101 (abce)
etc...
 
Back
Top