vb .net字符串排列。排列或组合?

时间:2014-01-13 05:47:25

标签: vb.net permutation

我有这样的字符串C - F - A - M。我想用条件创建一个组合:

  1. 最后一个字符旁边的每个其他项目必须与最后一个字符组合
  2. 不允许使用相同的组合,即使顺序不同。例如

    FC - M

    CF - M

  3. 如果字符串数组包含> = 3元素,它将生成2& 3个项目集,如果是2个元素,那么它将只生成2个项目集

  4. 下面是我的代码。我的代码生成的结果就像图片的右侧部分

    我的问题是我应该使用什么方法?它是排列,组合还是其他东西? 在伪代码中,我的情况会是什么样的?

    这是我的代码

    Public Class permute
    Dim ItemUsed() As Boolean
    Dim pno As Long, pString As String
    Dim inChars() As Char = {"c", "f", "a", "m"}
    
    Private Sub permute_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  
    End Sub
    
    Sub Permute(ByVal K As Long)
        ReDim ItemUsed(K)
        pno = 0
    
        Dim i As Integer
        For i = 2 To K
            Permutate(i, 1)
            tb.Text = K
        Next
    End Sub
    
    Private Sub Permutate(ByVal K As Long, ByVal pLevel As Long)
        Dim i As Long, Perm As String
        Perm = pString
    
        For i = 0 To K - 1
            If Not ItemUsed(i) Then
                If pLevel = 1 Then
                    pString = inChars(i)
                Else
                    pString += inChars(i)
                End If
                If pLevel = K Then
                    pno = pno + 1
                    Results.Text += _
                    pno & " " & " = " & " " & pString & vbCrLf
                    Exit Sub
                End If
    
                ItemUsed(i) = True
                Permutate(K, pLevel + 1)
                ItemUsed(i) = False
                pString = Perm
            End If
        Next
    End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Permute(tb.Text)
    End Sub
    
    Private Sub tb_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tb.TextChanged
        If tb.Text = "" Then
            Results.Text = ""
        Else
            Permute(tb.Text)
        End If
    End Sub
    End Class
    

    这是需求截图

    enter image description here

    这是程序截图

    enter image description here

2 个答案:

答案 0 :(得分:2)

将此课程添加到您的项目中:

Public NotInheritable Class Permutation

    Public Shared Function Create(array As Char()) As List(Of String)
        Return Permutation.Create(array, False)
    End Function

    Public Shared Function Create(array As Char(), sort As Boolean) As List(Of String)
        If (array Is Nothing) Then
            Throw New ArgumentNullException("array")
        ElseIf ((array.Length < 0) OrElse (array.Length > 13)) Then
            Throw New ArgumentOutOfRangeException("array")
        End If
        Dim list As New List(Of String)
        Dim n As Integer = array.Length
        Permutation.Permute(list, array, 0, array.Length)
        If (sort) Then
            list.Sort()
        End If
        Return list
    End Function

    Private Shared Sub Permute(list As List(Of String), array As Char(), start As Integer, n As Integer)
        Permutation.Print(list, array, n)
        If (start < n) Then
            Dim i, j As Integer
            For i = (n - 2) To start Step -1
                For j = (i + 1) To (n - 1)
                    Permutation.Swap(array, i, j)
                    Permutation.Permute(list, array, (i + 1), n)
                Next
                Permutation.RotateLeft(array, i, n)
            Next
        End If
    End Sub

    Private Shared Sub Print(list As List(Of String), array As Char(), size As Integer)
        If (array.Length <> 0) Then
            Dim s As Char() = New Char(size - 1) {}
            For i As Integer = 0 To (size - 1)
                s(i) = array(i)
            Next
            list.Add(s)
        End If
    End Sub

    Private Shared Sub RotateLeft(array As Char(), start As Integer, n As Integer)
        Dim tmp As Char = array(start)
        For i As Integer = start To (n - 2)
            array(i) = array(i + 1)
        Next
        array(n - 1) = tmp
    End Sub

    Private Shared Sub Swap(array As Char(), i As Integer, j As Integer)
        Dim tmp As Char
        tmp = array(i)
        array(i) = array(j)
        array(j) = tmp
    End Sub

End Class

由于Int32.MaxValue限制,此类将支持1到13级。

s=1, n=1
s=2, n=2
s=3, n=6
s=4, n=24
s=5, n=120
s=6, n=720
s=7, n=5040
s=8, n=40320
s=9, n=362880
s=10, n=3628800
s=11, n=39916800
s=12, n=479001600
s=13, n=6227020800

用法:

Me.TextBox1.Text = String.Join(Environment.NewLine, Permutation.Create({"c"c, "f"c, "a"c, "m"c}, sort:=False))

输出:

cfam
cfma
cafm
camf
cmfa
cmaf
fcam
fcma
facm
famc
fmca
fmac
acfm
acmf
afcm
afmc
amcf
amfc
mcfa
mcaf
mfca
mfac
macf
mafc

该课程基于以下链接中的C++代码:

Calculating Permutations and Job Interview Questions

答案 1 :(得分:1)

这似乎是组合问题,而不是排列

  

“在数学中,组合是一种从较大的群体中选择几种东西的方式,其中(与排列不同)顺序无关紧要”。 [Wikipedia]

尝试通过组合对阵列中除最后一项之外的所有项目进行解决。换句话说,为所有 k 执行组合操作 nCk

  • n =输入数组的大小减去最后一项
  • k =输出项目集的大小,最小 k 为1,最大值为 n

然后将每个组合结果附加到最后一项。以下是伪代码代码,使用C#语法:p

var input = new char[] {'C', 'F', 'A', 'M'};

//save last char
var lastChar = input[input.Length - 1];
//combinationInput is input member without the last character
var combinationInput = new char[input.Length - 1];
Array.Copy(input, 0, combinationInput, 0, combinationInput.Length);

//generate output with itemset size 1 to combinationInput.Length
for (int i = 1; i <= combinationInput.Length; i++)
{
    //generate combination with size i
    var combinationOutput = combinationInput.Combinations(i);
    foreach (var combinedChar in combinationOutput)
    {
        //print output as: combinationOutput item + lastChar
        Console.WriteLine(string.Join(", ", combinedChar) + ", " + lastChar);
    }
}

参考文献:

  1. Array.Copy(...)[How to copy part of an array to another array]
  2. .Combinations(int outputSize)扩展方法。 [How to Generate Combinations of Elements of a List in .NET 4.0]