请教如何取字符串的所有子串

blackieliu 2018-01-16 10:42:52
用vb去除输入字符串的所有子串
如 文本框输入abcd 在列表框输出
ab
ac
ad
abc
abd
acd
bc
bd
bcd
cd
abcd
...全文
1099 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
东方之珠 2018-01-26
  • 打赏
  • 举报
回复
这不就是百度的功能吗,输入AD,会下拉一长串出来
脆皮大雪糕 2018-01-17
  • 打赏
  • 举报
回复
引用 16 楼 chewinggum 的回复:
[quote=引用 14 楼 of123 的回复:] 有缺项,因为原来的代码是假定串是升序的。
Option Explicit
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Declare Function SendMessagebyString Lib _
    "user32" Alias "SendMessageA" (ByVal hWND As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As String) As Long
   
Private Sub Command1_Click()
   Dim strText As String
   Dim strTemp As String
   Dim strHead As String
   Dim i As Long, j As Long, k As Long, w As Long

   List1.Clear
   
   For i = 1 To Len(Text1.Text)
      List1.AddItem Mid(Text1, i, 1)
   Next i
   
   For i = 0 To List1.ListCount - 1
      strText = strText & List1.List(i)
   Next i
   
   List1.Clear
    For i = 1 To Len(strText) - 1
      strHead = Left(strText, 1)
      strText = Mid(strText, 2)
      w = Len(strText)
      For j = 1 To w
         For k = 1 To w - j + 1
            strTemp = strHead & Mid(strText, k, j)
            If -1 = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strTemp) Then
                List1.AddItem strTemp
            End If
         Next
      Next
   Next
      
   strText = Text1
   For i = 1 To Len(strText) - 1
      strHead = Left(strText, 1)
      strText = Mid(strText, 2)
      w = Len(strText)
      For j = 1 To w
         For k = 1 To w - j + 1
            strTemp = strHead & Mid(strText, k, j)
            If -1 = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strTemp) Then
                List1.AddItem strTemp
            End If
         Next
      Next
   Next
   
End Sub
AB
ABB
ABBC
ABBCC
ABBCCD
ABC
ABCB
ABCBC
ABCBCD
ABCC
ABCCD
ABCD
AC
ACB
ACBC
ACBCD
ACC
ACCD
ACD
AD
BB
BBC
BBCC
BBCCD
BBCD
BC
BCB
BCBC
BCBCD
BCC
BCCD
BCD
BD
CB
CBC
CBCD
CC
CCD
CD
貌似不应该出现AC这样的结果吧,子串应该是连续的吧[/quote] 好吧,楼主的例子也是这样,那就这么理解子串吧
脆皮大雪糕 2018-01-17
  • 打赏
  • 举报
回复
引用 14 楼 of123 的回复:
有缺项,因为原来的代码是假定串是升序的。
Option Explicit
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Declare Function SendMessagebyString Lib _
    "user32" Alias "SendMessageA" (ByVal hWND As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As String) As Long
   
Private Sub Command1_Click()
   Dim strText As String
   Dim strTemp As String
   Dim strHead As String
   Dim i As Long, j As Long, k As Long, w As Long

   List1.Clear
   
   For i = 1 To Len(Text1.Text)
      List1.AddItem Mid(Text1, i, 1)
   Next i
   
   For i = 0 To List1.ListCount - 1
      strText = strText & List1.List(i)
   Next i
   
   List1.Clear
    For i = 1 To Len(strText) - 1
      strHead = Left(strText, 1)
      strText = Mid(strText, 2)
      w = Len(strText)
      For j = 1 To w
         For k = 1 To w - j + 1
            strTemp = strHead & Mid(strText, k, j)
            If -1 = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strTemp) Then
                List1.AddItem strTemp
            End If
         Next
      Next
   Next
      
   strText = Text1
   For i = 1 To Len(strText) - 1
      strHead = Left(strText, 1)
      strText = Mid(strText, 2)
      w = Len(strText)
      For j = 1 To w
         For k = 1 To w - j + 1
            strTemp = strHead & Mid(strText, k, j)
            If -1 = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strTemp) Then
                List1.AddItem strTemp
            End If
         Next
      Next
   Next
   
End Sub
AB
ABB
ABBC
ABBCC
ABBCCD
ABC
ABCB
ABCBC
ABCBCD
ABCC
ABCCD
ABCD
AC
ACB
ACBC
ACBCD
ACC
ACCD
ACD
AD
BB
BBC
BBCC
BBCCD
BBCD
BC
BCB
BCBC
BCBCD
BCC
BCCD
BCD
BD
CB
CBC
CBCD
CC
CCD
CD
貌似不应该出现AC这样的结果吧,子串应该是连续的吧
脆皮大雪糕 2018-01-17
  • 打赏
  • 举报
回复
引用 13 楼 Chen8013 的回复:
[quote=引用 11 楼 chewinggum 的回复:] 重复串需要怎么处理 比如 “ABCBCD”
1. 首先: 未必会面对“重复”的情况;或者本身就不会出现(或能够避免)类似你说的这种情况。 2. 其次: 只需把“枚举”出来的结果记录下来,有N多种方法可以排除“重复结果”。 [/quote] 其实这个问题是问楼主的,属于需求的进一步确认。 有没有重复情况和重复情况怎么处理看楼主需求。
of123 2018-01-17
  • 打赏
  • 举报
回复
有缺项,因为原来的代码是假定串是升序的。
Option Explicit
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Declare Function SendMessagebyString Lib _
    "user32" Alias "SendMessageA" (ByVal hWND As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As String) As Long
   
Private Sub Command1_Click()
   Dim strText As String
   Dim strTemp As String
   Dim strHead As String
   Dim i As Long, j As Long, k As Long, w As Long

   List1.Clear
   
   For i = 1 To Len(Text1.Text)
      List1.AddItem Mid(Text1, i, 1)
   Next i
   
   For i = 0 To List1.ListCount - 1
      strText = strText & List1.List(i)
   Next i
   
   List1.Clear
    For i = 1 To Len(strText) - 1
      strHead = Left(strText, 1)
      strText = Mid(strText, 2)
      w = Len(strText)
      For j = 1 To w
         For k = 1 To w - j + 1
            strTemp = strHead & Mid(strText, k, j)
            If -1 = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strTemp) Then
                List1.AddItem strTemp
            End If
         Next
      Next
   Next
      
   strText = Text1
   For i = 1 To Len(strText) - 1
      strHead = Left(strText, 1)
      strText = Mid(strText, 2)
      w = Len(strText)
      For j = 1 To w
         For k = 1 To w - j + 1
            strTemp = strHead & Mid(strText, k, j)
            If -1 = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strTemp) Then
                List1.AddItem strTemp
            End If
         Next
      Next
   Next
   
End Sub
AB
ABB
ABBC
ABBCC
ABBCCD
ABC
ABCB
ABCBC
ABCBCD
ABCC
ABCCD
ABCD
AC
ACB
ACBC
ACBCD
ACC
ACCD
ACD
AD
BB
BBC
BBCC
BBCCD
BBCD
BC
BCB
BCBC
BCBCD
BCC
BCCD
BCD
BD
CB
CBC
CBCD
CC
CCD
CD
舉杯邀明月 2018-01-17
  • 打赏
  • 举报
回复
引用 11 楼 chewinggum 的回复:
重复串需要怎么处理 比如 “ABCBCD”
1. 首先: 未必会面对“重复”的情况;或者本身就不会出现(或能够避免)类似你说的这种情况。 2. 其次: 只需把“枚举”出来的结果记录下来,有N多种方法可以排除“重复结果”。
of123 2018-01-17
  • 打赏
  • 举报
回复
引用 11 楼 chewinggum 的回复:
重复串需要怎么处理 比如 “ABCBCD”
Option Explicit
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Declare Function SendMessagebyString Lib _
    "user32" Alias "SendMessageA" (ByVal hWND As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As String) As Long
   
Private Sub Command1_Click()
   Dim strText As String
   Dim strTemp As String
   Dim strHead As String
   Dim i As Long, j As Long, k As Long, w As Long

   strText = Text1
   List1.Clear
   For i = 1 To Len(strText) - 1
      strHead = Left(strText, 1)
      strText = Mid(strText, 2)
      w = Len(strText)
      For j = 1 To w
         For k = 1 To w - j + 1
            strTemp = strHead & Mid(strText, k, j)
            If -1 = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strTemp) Then
                List1.AddItem strTemp
            End If
         Next
      Next
   Next
End Sub
Text1 = “ABCBCD” List1 (Sorted = True):
AB
ABC
ABCB
ABCBC
ABCBCD
ABCD
AC
ACB
ACBC
ACBCD
ACD
AD
BB
BBC
BBCD
BC
BCB
BCBC
BCBCD
BCD
BD
CB
CBC
CBCD
CC
CCD
CD
脆皮大雪糕 2018-01-17
  • 打赏
  • 举报
回复
重复串需要怎么处理 比如 “ABCBCD”
X-i-n 2018-01-16
  • 打赏
  • 举报
回复
给一下子串的定义
海鸥软件 2018-01-16
  • 打赏
  • 举报
回复
“用vb去除输入字符串的所有子串”,没看明白你这句话,你这不就是输入一个字符串,然后将从前往后的所有组合做输出吗?用一个循环加一个内循环不就解决啦?
舉杯邀明月 2018-01-16
  • 打赏
  • 举报
回复
楼主参考一下这个:
Option Explicit

Private Sub Command1_Click()
   Dim strText As String
   Dim strTemp As String
   Dim i&, j&, k&, w&

   strText = "ABCDE"
   For i = 1& To Len(strText) - 1&
      strTemp = Mid$(strText, 1&, 1&)
      strText = Mid$(strText, 2&)
      w = Len(strText)
      For j = 1& To w
         For k = 1& To 1& + w - j
            Debug.Print strTemp & Mid$(strText, k, j)
         Next
      Next
   Next
End Sub
输出结果:
AB
AC
AD
AE
ABC
ACD
ADE
ABCD
ACDE
ABCDE
BC
BD
BE
BCD
BDE
BCDE
CD
CE
CDE
DE
blackieliu 2018-01-16
  • 打赏
  • 举报
回复
引用 4 楼 of123 的回复:
他的意思是取一个字符串的所有字串组合并输出。估计是作业。
谢谢 我的意思确实是输出能产生的字串组合
blackieliu 2018-01-16
  • 打赏
  • 举报
回复
引用 2 楼 Runnerchin 的回复:
给一下子串的定义
可能是我表达有问题吧 我要做的是类似于求集合排除掉单个元素的所有子集
blackieliu 2018-01-16
  • 打赏
  • 举报
回复
引用 1 楼 hsgzr1 的回复:
“用vb去除输入字符串的所有子串”,没看明白你这句话,你这不就是输入一个字符串,然后将从前往后的所有组合做输出吗?用一个循环加一个内循环不就解决啦?
不好意思 是取出,打字时疏忽了
xzjxucxx 2018-01-16
  • 打赏
  • 举报
回复
你是求所有字符的组合,写的递归就很容易解决的
of123 2018-01-16
  • 打赏
  • 举报
回复
不过,使用子串的说法是错误的。楼主列出的 ac、abd、acd、ad、bd 都不是 abcd 的“子串”。她们只是 abcd 串中字符的顺向组合。 如果题目确为取子串,一种方法如下:
Private Sub Command1_Click()
    Dim strSource As String
    Dim strSub As String, i As Integer, j As Integer

    For i = 1 To Len(Text1) - 1
        For j = 2 To Len(Text1) - i + 1
            List1.AddItem Mid(Text1, i, j)
        Next j
    Next i
End Sub
of123 2018-01-16
  • 打赏
  • 举报
回复
他的意思是取一个字符串的所有字串组合并输出。估计是作业。
hongss 2018-01-16
  • 打赏
  • 举报
回复
这不是子串吧?

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧