vb .net 字符串排列.排列还是组合? [英] vb .net permutation of string. permutation or combination?

查看:28
本文介绍了vb .net 字符串排列.排列还是组合?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i've got arary of string like this C - F - A - M. i want to create a combination from that with condition:

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

  1. each other item beside last character has to be combined with last character
  2. there's not allowed a same combination, even the order is different. for example

FC - M

CF - M

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

if the string array contains >=3 element it will generate 2 & 3 itemset, if 2 element then it will generate only 2 itemset

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

below is my code. my code generate the result like right part of the picture

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

my question is what method should i use? is it permutation, combination, or other things? and in pseudocode, what is my case would be like?

这是我的代码

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

这是需求截图

这是程序截图

推荐答案

将此类添加到您的项目中:

Add this class to your project:

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.

Because of the Int32.MaxValue limit this class will support levels 1 through 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++ 代码:

The class is based on C++ code from the following link:

计算排列和求职面试问题

这篇关于vb .net 字符串排列.排列还是组合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆