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

blackieliu 2018-01-16 10:42:52
用vb去除输入字符串的所有子串
如 文本框输入abcd 在列表框输出
ab
ac
ad
abc
abd
acd
bc
bd
bcd
cd
abcd
...全文
1098 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
  • 打赏
  • 举报
回复
这不是子串吧?
课程介绍:第一章:正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中出符合某个条件的子串等。第二章:http协议是一种无状态协议,不记录用户行为,我们可以利用cookie记录数据,方便用户操作,提升用户体验。第三章:ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。第四章:本章主要讲解JS动画原理、动画函数封装和轮播。第五章:本章主要讲解面向对象、构造函数和继承、原型链和继承。第六章:本节课程主要讲解了什么是Ajax、如何使用Ajax发送get请求、如何使用Ajax发送post请求、JSON数据格式、回调地狱、Promise和Ajax的同源策略、跨域请求。第七章:本章主要讲解html、val、attr、prop、class、全选框、动画、节点遍历、ajax、sonp、event、multiple、plugin、plugin、magnifier。第八章:本章主要讲解UML类图、单例模式、工厂模式、策略模式、代理模式、观察者模式。第九章:本章主要讲解为什么要模块化、原生JS中,模块的写法、AMD、CommonJS&Webpack。第十章:本节课程主要讲解了服务器安装环境配置、端口及ip基本常识、简单认识PHP(helloworld)、基本语法和动态网页原理。第十一章:本节课程主要讲解了什么是SASS、SASS的预处理、ass语法(变量、嵌套、导入、mixin、扩展、function、expression)。第十二章:本节课程主要讲解了什么是GULP、GULP环境配置、GULP基本使用及GULP的插件安装与使用。

7,762

社区成员

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

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