如何在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