如何在VB.Net中生成一个字符串的所有分区组合

如何在VB.Net中生成一个字符串的所有分区组合,vb.net,visual-studio-2012,Vb.net,Visual Studio 2012,给定一个字符串,如何生成它的所有分区(以逗号分隔的较小字符串显示) 另外,长度为n的字符串的分区总数是多少 下面将给出结果,但对长字符串不好 String: CODE C,O,D,E C,O,DE C,OD,E C,ODE CO,D,E CO,DE COD,E String: PEACE P,E,A,C,E P,E,A,CE P,E,AC,E P,E,ACE P,EA,C,E P,EA,CE P,EAC,E PE,A,C,E PE,A,CE PE,AC,E PE,ACE PEA,C,E

给定一个字符串,如何生成它的所有分区(以逗号分隔的较小字符串显示)
另外,长度为n的字符串的分区总数是多少

下面将给出结果,但对长字符串不好

String: CODE

C,O,D,E
C,O,DE
C,OD,E
C,ODE
CO,D,E
CO,DE
COD,E


String: PEACE

P,E,A,C,E
P,E,A,CE
P,E,AC,E
P,E,ACE
P,EA,C,E
P,EA,CE
P,EAC,E
PE,A,C,E
PE,A,CE
PE,AC,E
PE,ACE
PEA,C,E
PEA,CE

Sub getAllComb()

    oriStr = TextBox1.Text
    Dim tmp = ""
    Dim k = 0
    For i = 0 To oriStr.Length
        For j = 1 To 3
            'tmp = Mid(oriStr, i, j)
            Try
                tmp1(k) = oriStr.Substring(i, j)
                k = k + 1
                'tmp = oriStr.Substring(i, j)
                'Debug.Print(tmp)
            Catch ex As Exception
                'Debug.Print("Error>>>>" + ex.Message)
                Exit For
            End Try

        Next
    Next
    tmp = ""
    For i = 0 To k
        Debug.Print(i.ToString + "<i " + tmp1(i))
        tmp = tmp & tmp1(i) & vbCrLf
    Next
    'MessageBox.Show(tmp) 


    Dim tmpAll1 = ""

    tmpAll1 = addFunclen4(k)


    MessageBox.Show(tmpAll1)
    Debug.Print(tmpAll1)

    TextBox1.Text = oriStr & vbCrLf & vbCrLf & tmpAll1
End Sub



Function addFunclen4(k As Integer) As String
    Dim retVal = ""
    Dim tmp = ""
    Dim tmpAll = ""
    Dim tmpStr = ""
    Dim tmpAll1 = ""
    For i = 0 To k
        For i1 = 0 To k
            For i2 = 0 To k
                For i3 = 0 To k
                    For i4 = 0 To k

                        tmp = Form1.tmp1(i) + Form1.tmp1(i1) + Form1.tmp1(i2) + Form1.tmp1(i3) + Form1.tmp1(i4)
                        If Form1.tmp1(i) <> "" Then
                            If tmp = Form1.oriStr Then
                                tmpStr = Form1.tmp1(i) + "," + Form1.tmp1(i1) + "," + Form1.tmp1(i2) + "," + Form1.tmp1(i3) + "," + Form1.tmp1(i4)
                                Do While tmpStr.Contains(",,") = True
                                    tmpStr = Replace(tmpStr, ",,", ",")
                                Loop
                                If Mid(tmpStr, tmpStr.Length, 1) = "," Then
                                    tmpStr = Mid(tmpStr, 1, tmpStr.Length - 1)
                                End If

                                If tmpAll1.Contains(tmpStr) = False Then
                                    tmpAll1 = tmpAll1 + tmpStr + vbCrLf
                                End If
                            End If

                        End If
                    Next
                Next
            Next
        Next

    Next
    retVal = tmpAll1

    Return retVal
End Function
String:code
C、 O,D,E
C、 奥德
C、 OD,E
C、 颂歌
CO,D,E
CO,DE
鳕鱼
弦:和平
P、 E,A,C,E
P、 E,A,CE
P、 E,AC,E
P、 E,A
P、 EA、C、E
P、 EA,CE
P、 选管会
PE、A、C、E
体育
PE、AC、E
体育,王牌
豌豆
豌豆,CE
子getAllComb()
oriStr=TextBox1.Text
Dim tmp=“”
尺寸k=0
对于i=0到oriStr.长度
对于j=1到3
'tmp=Mid(oriStr,i,j)
尝试
tmp1(k)=oriStr.子串(i,j)
k=k+1
'tmp=oriStr.子串(i,j)
'Debug.Print(tmp)
特例
'Debug.Print(“错误>>>”+ex.Message)
退出
结束尝试
下一个
下一个
tmp=“”
对于i=0到k
调试.打印(i.ToString+“我估计总共[2^(n-1)-1]:
(n-1)放置逗号的位置,2个“状态”(逗号或非逗号),-1表示没有逗号的普通情况

一个更简单的算法是遍历案例的数量,并使用二进制表示来确定是否在每个位置放置逗号

例如(带有文本框、按钮和列表框的简单表单):

Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
ListBox1.Items.Clear()
Dim s As String=TextBox1.Text
如果s.长度小于2,则
MessageBox.Show(“输入更长的字符串”)
返回
如果结束
对于i=1到Math.Pow(2,s.长度-1)-1
将结果变暗为字符串=s(0)
对于j=1到s,长度为-1
结果=结果和命令(i,j)和s(j)
下一个
ListBox1.Items.Add(结果)
下一个
端接头
私有函数CommaOrNot(i为整数,j为整数)为字符串
如果(i和Math.Pow(2,j-1))=Math.Pow(2,j-1),那么
返回“,”
其他的
返回“”
如果结束
端函数

我非常喜欢Fruthbat的方法。下面是一个替代版本,它使用了稍微不同的机制来表示二进制数,以及如何确定是否应该包含逗号:

Public Class Form1

    Private combinations As List(Of String)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim s As String = TextBox1.Text
        If s.Length < 2 Then
            MessageBox.Show("Enter a longer string")
            Exit Sub
        End If

        Button1.Enabled = False
        ListBox1.DataSource = Nothing
        ListBox1.Items.Clear()
        ListBox1.Items.Add("Generating combinations...")
        BackgroundWorker1.RunWorkerAsync(s)
    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim s As String = e.Argument
        Dim combinations As New List(Of String)

        Dim binary() As Char
        Dim values() As Char = s.ToCharArray
        Dim max As Integer = Convert.ToInt32(New String("1", s.Length - 1), 2)
        Dim sb As New System.Text.StringBuilder
        For i As Integer = 0 To max
            sb.Clear()
            binary = Convert.ToString(i, 2).PadLeft(values.Length, "0").ToCharArray
            For j As Integer = 0 To values.Length - 1
                sb.Append(If(binary(j) = "0", "", ","))
                sb.Append(values(j))
            Next
            combinations.Add(sb.ToString)
        Next

        e.Result = combinations
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        combinations = e.Result
        ListBox1.Items.Clear()
        ListBox1.Items.Add("Generating combinations...Done!")
        ListBox1.Items.Add("Adding Results...one moment please!")
        Application.DoEvents()

        ListBox1.DataSource = Nothing
        ListBox1.DataSource = combinations
        Button1.Enabled = True
        MessageBox.Show("Done!")
    End Sub

End Class
公共类表单1
私有组合作为列表(字符串)
私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Dim s As String=TextBox1.Text
如果s.长度小于2,则
MessageBox.Show(“输入更长的字符串”)
出口接头
如果结束
按钮1.已启用=错误
ListBox1.DataSource=无
ListBox1.Items.Clear()
ListBox1.Items.Add(“生成组合…”)
BackgroundWorker1.RunWorkerAsync(s)
端接头
私有子BackgroundWorker1\u DoWork(发送方作为对象,e作为System.ComponentModel.DoWorkEventArgs)处理BackgroundWorker1.DoWork
Dim s As String=e.参数
作为新列表的Dim组合(字符串)
Dim binary()作为字符
Dim values()作为Char=s.ToCharArray
Dim max As Integer=Convert.ToInt32(新字符串(“1”,s.长度-1),2)
将sb设置为新System.Text.StringBuilder
对于i,作为整数=0到最大值
某人清楚
binary=Convert.ToString(i,2).PadLeft(values.Length,“0”).tocharray
对于j,整数=0到值。长度-1
sb.追加(如果(二进制(j)=“0”、“”、“”、“”)
sb.附加(值(j))
下一个
添加(某人的字符串)
下一个
e、 结果=组合
端接头
私有子BackgroundWorker1\u RunWorkerCompleted(发送方作为对象,e作为System.ComponentModel.RunWorkerCompletedEventArgs)处理BackgroundWorker1.RunWorkerCompleted
组合=e.结果
ListBox1.Items.Clear()
ListBox1.Items.Add(“生成组合…完成!”)
ListBox1.Items.Add(“添加结果…请稍等!”)
Application.DoEvents()
ListBox1.DataSource=无
ListBox1.DataSource=组合
按钮1.已启用=真
MessageBox.Show(“完成!”)
端接头
末级

您已经标记了Java和VB.net这两种完全不同的语言。您对哪种语言感兴趣?如果Java标记是关于VB.net的,那么它在这里做什么?请向我们展示更多示例:)@Arlind我尝试过小长度的字符串,但是,长长度非常耗时。@brso05请参阅上面的代码。我已经添加了。它工作得非常好,速度非常快。使用
sb.Remove(0,sb.length)
代替
sb.Clear()
。感谢您的关注,并重新讨论这个问题。
Public Class Form1

    Private combinations As List(Of String)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim s As String = TextBox1.Text
        If s.Length < 2 Then
            MessageBox.Show("Enter a longer string")
            Exit Sub
        End If

        Button1.Enabled = False
        ListBox1.DataSource = Nothing
        ListBox1.Items.Clear()
        ListBox1.Items.Add("Generating combinations...")
        BackgroundWorker1.RunWorkerAsync(s)
    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim s As String = e.Argument
        Dim combinations As New List(Of String)

        Dim binary() As Char
        Dim values() As Char = s.ToCharArray
        Dim max As Integer = Convert.ToInt32(New String("1", s.Length - 1), 2)
        Dim sb As New System.Text.StringBuilder
        For i As Integer = 0 To max
            sb.Clear()
            binary = Convert.ToString(i, 2).PadLeft(values.Length, "0").ToCharArray
            For j As Integer = 0 To values.Length - 1
                sb.Append(If(binary(j) = "0", "", ","))
                sb.Append(values(j))
            Next
            combinations.Add(sb.ToString)
        Next

        e.Result = combinations
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        combinations = e.Result
        ListBox1.Items.Clear()
        ListBox1.Items.Add("Generating combinations...Done!")
        ListBox1.Items.Add("Adding Results...one moment please!")
        Application.DoEvents()

        ListBox1.DataSource = Nothing
        ListBox1.DataSource = combinations
        Button1.Enabled = True
        MessageBox.Show("Done!")
    End Sub

End Class