问题同上!
如果以后再考虑到字串之间的关系、或字串是符合某些规则的不确定字符这个问题就比较有趣了!

解决方案 »

  1.   

    字符串123465777890
         5447894
         8784545ee333eew
         325eht663333144548effeaw
         ....
    有1万个,
    ------------------------------
    子串12547
        33rfw
        3r3hh
        789
        2346
        ...
    有100个,
    -----------------------------
    求每次在字符串里首先出现的子串,高效率的写法??
      

  2.   

    Private Sub Form_Load()
        Dim i As Integer
        Dim strF As String
        Dim str(100) As String
        strF = "12346577789054478948784545ee333eew325eht663333144548effeaw "
        For i = 0 To 100
            If InStr(1, strF, str(i)) > 0 Then
                MsgBox str(i)
            End If
        Next
    End Sub
    这个意思?
      

  3.   

    不就是用split()函数,循环,逐个子串判断,楼主已经有实现的?高效率的?不是很明白
      

  4.   


    Private Sub Command1_Click()
        Dim i As Integer
        Dim strF(10000) As String
        Dim strS() As String
        
        For i = 0 To 10000'一次循环是必需的
            strS = Split(strF(i), ",")'如果每个子字符串是用“,”分隔;如果是空格 Split(strF(i))
            Debug.Print strS(0)'不管是100种还是多少种,只取第一个子串
            stop
        Next
    End Sub
      

  5.   

     king06 感谢你的热心,不过你回答让我崩溃,不知道是不是我的问题不够清楚!例:字符串1 上海市南京路和附件的淮海路
        字符串2 
        字符串3 子串1:淮海路
    子串2:南京路
    子串3:北京路
          字符串1查询子串结果为:淮海路
    字符串2查询子串结果为:???
    ----------------------------------------够简单的了,还没去考虑——
    子串1:淮海路
    子串2:南京路口
    子串3:南京路
    子串4:北京路
    在加几个条件就会极端复杂
          
      

  6.   

    晕纯字符串游戏    Dim i As Integer, j As Integer
        Dim strF(10000) As String
        Dim str(100) As String
        
        For i = 0 To 9999
            For j = 0 To 99
                If InStr(1, strF(i), str(j)) > 0 Then
                    Debug.Print str(j)
                    Exit For
                End If
            Next j    Next i
      

  7.   


    Private Sub Command1_Click()
        Dim i As Integer, j As Integer
        Dim strF(3) As String '10000缩影
        Dim str(6) As String '100缩影
        Dim a(3) As Integer '记录子串出现的位置
        Dim b(3) As String '记录当前字串
        
        strF(0) = "上海市南京路附近的淮海路"
        strF(1) = "南京西路步行街上和平饭店\福州路上上海书城\东方明珠\世纪大道"
        strF(2) = "上海图书馆衡山路/成都北路/崂山路"
        
        str(0) = "南京路"
        str(1) = "淮海路"
        str(2) = "北京路"
        str(3) = "福州路"
        str(4) = "衡山路"
        str(5) = "成都北路"
        
        For i = 0 To 2
            a(i) = Len(strF(i))
            For j = 0 To 5
                If InStr(1, strF(i), str(j)) > 0 And InStr(1, strF(i), str(j)) < a(i) Then
                    a(i) = InStr(1, strF(i), str(j))
                    b(i) = str(j)
                End If
            Next j
            Debug.Print b(i)
        Next i
    End Sub经测试通过,不过我想不出更高效的方法了,Mark
      

  8.   

    Option Explicit
    Private Sub Command1_Click()
        Dim i As Integer, j As Integer
        Dim strF(3) As String '10000缩影
        Dim str(6) As String '100缩影
        Dim a(3) As Integer '记录子串出现的位置
        Dim b(3) As String '记录当前字串
        Dim x As Integer       '记录字串出现的位置
        Dim strlen(6) As String '记录子串的宽度
        
        strF(0) = "上海市南京路附近的淮海路"
        strF(1) = "南京西路步行街上和平饭店\福州路上上海书城\南京路东方明珠\世纪大道"
        strF(2) = "上海图书馆衡山路/成都北路/崂山路"
        
        str(0) = "南京路"
        str(1) = "淮海路"
        str(2) = "北京路"
        str(3) = "福州路"
        str(4) = "衡山路"
        str(5) = "成都北路"
        
        strlen(0) = 3
        strlen(1) = 3
        strlen(2) = 3
        strlen(3) = 3
        strlen(4) = 3
        strlen(5) = 4
        
        For i = 0 To 2
            a(i) = Len(strF(i))
            For j = 0 To 5
                x = InStr(1, strF(i), str(j))
                If x > 0 Then
                    strF(i) = Left(strF(i), x + strlen(j))
                    b(i) = str(j)
                End If
            Next j
            x = 0
            Debug.Print b(i)
        Next i
    End Sub应该还有更快的算法,不过老板不给奖金!任务是完成工作,不是完成工作+时间要求,所以再快也是个人兴趣了!
      

  9.   

    感谢king06 ,你的回答颜色和框是怎么弄上去的?
      

  10.   

    用数据库处理最高效了,而且可以将结果做成永久表。
    CREATE TABLE T1 (S varchar(200));
    INSERT INTO T1 VALUES ('上海市南京路附近的淮海路');
    INSERT INTO T1 VALUES ('南京西路步行街上和平饭店\福州路上上海书城\东方明珠\世纪大道');
    INSERT INTO T1 VALUES ('上海图书馆衡山路/成都北路/崂山路');CREATE TABLE T2 (S varchar(20));
    INSERT INTO T2 VALUES ('南京路');
    INSERT INTO T2 VALUES ('淮海路');
    INSERT INTO T2 VALUES ('北京路');
    INSERT INTO T2 VALUES ('福州路');
    INSERT INTO T2 VALUES ('衡山路');
    INSERT INTO T2 VALUES ('成都北路');SELECT T1.S S1, T2.S S2, CHARINDEX(T2.S, T1.S) Position
      FROM T1, T2
     WHERE CHARINDEX(T2.S, T1.S)>0
       AND NOT EXISTS(SELECT * FROM T2 TX
                       WHERE CHARINDEX(TX.S, T1.S)>0
                         AND CHARINDEX(TX.S, T1.S)<CHARINDEX(T2.S, T1.S)
                     )
      

  11.   

    不知道正则是不是可以快点:
    '引用 Microsoft VBScript Regular Expressions 5.5    Dim re As RegExp
        Dim s As String
        
        s = "上海市南京路附近的淮海路"
        Set re = New RegExp
        re.Pattern = "淮海路|北京路|福州路|衡山路|成都北路|南京路"
        If re.Test(s) Then
            Debug.Print re.Execute(s)(0)
        End If'结果:  南京路
      

  12.   

    在LZ的代码上作些小修改:
    Option ExplicitPrivate Sub Command1_Click()
        Dim i As Integer, j As Integer
        Dim strF(3) As String   '10000缩影
        Dim str(6) As String    '100缩影
        Dim strlen(6) As String '记录子串的宽度
        Dim MinLen As Integer   '子串宽度的最小值
        Dim a(3) As Integer     '记录子串出现的位置
        Dim b(3) As String      '记录当前字串
        Dim x As Integer        '记录字串出现的位置
        
        strF(0) = "上海市南京路附近的淮海路"
        strF(1) = "南京西路步行街上和平饭店\福州路上上海书城\南京路东方明珠\世纪大道"
        strF(2) = "上海图书馆衡山路/成都北路/崂山路"
        
        str(0) = "南京路"
        str(1) = "淮海路"
        str(2) = "北京路"
        str(3) = "福州路"
        str(4) = "衡山路"
        str(5) = "成都北路"
        
        MinLen = Len(str(0))
        For i = 0 To 5
            strlen(i) = Len(str(i))
            If strlen(i) < MinLen Then MinLen = strlen(i)
        Next i
        
        For i = 0 To 2
            a(i) = Len(strF(i))
            For j = 0 To 5
                x = InStr(1, strF(i), str(j))
                If x > 0 And x < a(i) Then        '增加 x<a(i) 的判断
                    a(i) = x
                  b(i) = str(j)
                  '如果找到的位置前面的字符数已经小于子串宽度的最小值,则不需要继续查找了
                    If x < MinLen Then Exit For
                  '子串中应该不会出现一个是"南京路", 另一个是"南京"这样的情况, 所以这里修改一下
                    'strF(i) = Left(strF(i), x + strlen(j))
                  strF(i) = Left(strF(i), x - 1)
                End If
            Next j
            Debug.Print b(i)
        Next i
    End Sub
      

  13.   


    看了楼主的代码。最好不要进行字符串的重组。在 VB 中字符串的处理是最慢的。例如这样:    Dim p As Integer    ......    For i = 0 To 2
            a(i) = Len(strF(i))
            p = a(i)
            For j = 0 To 5
                x = InStrRev(strF(i), str(j), p)
                If x > 0 Then
                    p = x + strlen(j) - 2
                    b(i) = str(j)
                End If
            Next j
            Debug.Print b(i)
        Next i
      

  14.   

    是啊  VB 处理 字符串 很慢  很费时
    如果内容不多的话  没什么 高效不高效的 再快也快不到哪去 跟排序一个道理
    如果内容多 不如考虑
    用 Ascii码 或用 Byte数组 字符串可以直接赋值给byte数组
      

  15.   


    InstrRev("1234567890abcde1234abcde","abcde") =20
    在父串中不包含重复子串的情况下是个好方法,好奇的想不知道InstrRev实际是从父串长度-子串长度的位置20开始比完a接着比b,还是逆序从最后e比完接着比d!
    --------------------------想起以前碰到的一个分词问题,
    示例:山西省太原市中国建设银行
    可能查询有:
    山西太原市中国建设银行
    山西省太原中国建设银行
    山西太原建行

    不知道百度他们是怎么处理这种问题的,因为当时是有限样本,所以就人工把可能的关键字都写了进去。在有限样本的情况下,怎么考虑分词呢,请教一下?