上例应该输出babcbad就行了。您没仔细看代码,不只是要改一个地方,从左边取的要改,从右边取的也要改。代码: Private Sub Form_Load() Dim s As String, sTmp As String, sLeft As String, sRight As String, sLong As String Dim sStrIn() As String Dim i As Byte, l As Byte s = "babc,abcba,cbad" 's = "acb,acbbc,ef,b" 's = "bbf,fbb,acbb" 's = "a,bc,ca" 's = "cabe,bef,abex" sStrIn = Split(s, ",") '赋值给数组 For i = 0 To UBound(sStrIn) '排序 For l = i To UBound(sStrIn) If Len(sStrIn(i)) < Len(sStrIn(l)) Then sTmp = sStrIn(i) sStrIn(i) = sStrIn(l) sStrIn(l) = sTmp End If Next l Next isLong = sStrIn(0) '最长的赋值给母串 sLeft = sStrIn(0) sRight = sStrIn(0) For i = 1 To UBound(sStrIn) If InStr(sLeft, sStrIn(i)) = 0 Then '把不包含的字符加到左边 For l = 1 To Len(sStrIn(i)) If InStr(Left(sLeft, Len(sStrIn(i)) - l), Right(sStrIn(i), Len(sStrIn(i)) - l)) Then '如果有部分包含在母字符串中 sLeft = Left(sStrIn(i), l) & sLeft '添加不含的到左边部分 Exit For '退出处理 End If If l = Len(sStrIn(i)) Then sLeft = sStrIn(i) & sLeft '都不含,全部加 Next l End If
If InStr(sRight, sStrIn(i)) = 0 Then '把不包含的字符加到右边 For l = 1 To Len(sStrIn(i)) If InStr(Right(sRight, Len(sStrIn(i)) - l), Left(sStrIn(i), Len(sStrIn(i)) - l)) Then '如果有部分包含在母字符串中 sRight = sRight & Right(sStrIn(i), l) '添加不含的到右边部分 Exit For '退出处理 End If If l = Len(sStrIn(i)) Then sRight = sRight & sStrIn(i) '都不含,全部加 Next l End If If Len(sRight) <> Len(sLeft) Then ' 比较长度,不同取最短 If Len(sRight) < Len(sLeft) Then '取最短的 sLong = sRight Else sLong = sLeft End If sLeft = sLong '取最短的当作母字符串再去下一轮比较 sRight = sLong End If Next i If Len(sLong) < Len(sLeft) Then '如果相同长度 sLong = sLeft '获得最终结果 If Len(sLong) = Len(sRight) Then sLong = sLeft & "或者" & sRight End If Me.Caption = sLong '输出 End Sub
额......是这样的,你的代码好像有点问题,例如:(“abc”,"bcdd","ddee"),应该输出“abcddee”,而你的代码则输出“abcdde”!
If InStr(Left(sLeft, Len(sStrIn(i)) - l), Right(sStrIn(i), Len(sStrIn(i)) - l)) Then '如果有部分包含在母字符串中
s = "aee,aeefff,fee,edd,dee"
我感觉就是要对字符串的不同排列做交集运算...楼主的思路是先找最长的字符串,这个不错,可问题有多个最长字符串,不排列就不能穷尽结果...
上例应该输出babcbad就行了。您没仔细看代码,不只是要改一个地方,从左边取的要改,从右边取的也要改。代码:
Private Sub Form_Load()
Dim s As String, sTmp As String, sLeft As String, sRight As String, sLong As String
Dim sStrIn() As String
Dim i As Byte, l As Byte
s = "babc,abcba,cbad"
's = "acb,acbbc,ef,b"
's = "bbf,fbb,acbb"
's = "a,bc,ca"
's = "cabe,bef,abex"
sStrIn = Split(s, ",") '赋值给数组
For i = 0 To UBound(sStrIn) '排序
For l = i To UBound(sStrIn)
If Len(sStrIn(i)) < Len(sStrIn(l)) Then
sTmp = sStrIn(i)
sStrIn(i) = sStrIn(l)
sStrIn(l) = sTmp
End If
Next l
Next isLong = sStrIn(0) '最长的赋值给母串
sLeft = sStrIn(0)
sRight = sStrIn(0)
For i = 1 To UBound(sStrIn)
If InStr(sLeft, sStrIn(i)) = 0 Then '把不包含的字符加到左边
For l = 1 To Len(sStrIn(i))
If InStr(Left(sLeft, Len(sStrIn(i)) - l), Right(sStrIn(i), Len(sStrIn(i)) - l)) Then '如果有部分包含在母字符串中
sLeft = Left(sStrIn(i), l) & sLeft '添加不含的到左边部分
Exit For '退出处理
End If
If l = Len(sStrIn(i)) Then sLeft = sStrIn(i) & sLeft '都不含,全部加
Next l
End If
If InStr(sRight, sStrIn(i)) = 0 Then '把不包含的字符加到右边
For l = 1 To Len(sStrIn(i))
If InStr(Right(sRight, Len(sStrIn(i)) - l), Left(sStrIn(i), Len(sStrIn(i)) - l)) Then '如果有部分包含在母字符串中
sRight = sRight & Right(sStrIn(i), l) '添加不含的到右边部分
Exit For '退出处理
End If
If l = Len(sStrIn(i)) Then sRight = sRight & sStrIn(i) '都不含,全部加
Next l
End If
If Len(sRight) <> Len(sLeft) Then ' 比较长度,不同取最短
If Len(sRight) < Len(sLeft) Then '取最短的
sLong = sRight
Else
sLong = sLeft
End If
sLeft = sLong '取最短的当作母字符串再去下一轮比较
sRight = sLong
End If
Next i
If Len(sLong) < Len(sLeft) Then '如果相同长度
sLong = sLeft '获得最终结果
If Len(sLong) = Len(sRight) Then sLong = sLeft & "或者" & sRight
End If
Me.Caption = sLong '输出
End Sub
还是不行,如果是"babc","abcba","cbad",应输出“abcbabcbad”或"babcabcbad",而实际输出“abcbacd”!确实是我看错了,应是“babcbad",看来我被这题折磨透了!