Vb.net net字符串排列。排列还是组合?

Vb.net net字符串排列。排列还是组合?,vb.net,permutation,Vb.net,Permutation,我有很多这样的字符串C-F-A-M。我想根据该条件创建一个组合: 最后一个字符旁边的其他项目必须与最后一个字符组合 不允许有相同的组合,即使顺序不同。比如说 FC-M CF-M 如果字符串数组包含>=3个元素,它将生成2&3个itemset;如果包含2个元素,它将只生成2个itemset 下面是我的代码。我的代码生成的结果与图片的右侧部分类似 我的问题是我应该用什么方法?它是排列、组合还是其他东西? 在伪代码中,我的情况会是什么样 这是我的密码 Public Class permute Dim

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

  • 最后一个字符旁边的其他项目必须与最后一个字符组合
  • 不允许有相同的组合,即使顺序不同。比如说

    FC-M

    CF-M

  • 如果字符串数组包含>=3个元素,它将生成2&3个itemset;如果包含2个元素,它将只生成2个itemset

  • 下面是我的代码。我的代码生成的结果与图片的右侧部分类似

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

    这是我的密码

    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
    
    这是要求截图

    这是节目截图

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

    “在数学中,组合是从一个更大的组中选择若干事物的一种方式,其中(与排列不同)顺序并不重要”。[]

    尝试通过对数组中除最后一项之外的所有项进行组合来解决此问题。或者换句话说,对所有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);
        }
    }
    
    var input=newchar[]{'C','F','A','M'};
    //保存最后一个字符
    var lastChar=input[input.Length-1];
    //combinationInput是没有最后一个字符的输入成员
    var combinationInput=新字符[input.Length-1];
    复制(输入,0,combinationInput,0,combinationInput.Length);
    //将itemset大小为1的输出生成为combinationInput.Length
    
    对于(int i=1;i将此类添加到项目中:

    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
    
    用法:

    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++
    代码:


    这是你的家庭作业吗?我的论文很准确,我只是要求提供伪代码,因为如果不先了解算法回溯中的工作原理,我仍然无法理解如何编写代码;)
    cfam
    cfma
    cafm
    camf
    cmfa
    cmaf
    fcam
    fcma
    facm
    famc
    fmca
    fmac
    acfm
    acmf
    afcm
    afmc
    amcf
    amfc
    mcfa
    mcaf
    mfca
    mfac
    macf
    mafc