51Testing软件测试论坛
标题:
求高手指教:生成字串的所有可能组合
[打印本页]
作者:
五百螺汉
时间:
2008-5-3 21:37
标题:
求高手指教:生成字串的所有可能组合
生成下面字串的所有可能组合:
“E”,”F”,”IJK”, “9”, “87”, “KM”
作者:
五百螺汉
时间:
2008-5-3 21:38
请问一下,这段脚本应该怎么写?
作者:
walker1020
时间:
2008-5-4 00:36
提示一点:使用 Left、 Length等函数和 + 操作符,再加上一个循环语句,基本就可以实现了。具体只能由你自己去实现了
作者:
hsjzfling
时间:
2008-5-4 14:43
这个。。。"生成字串的所有可能组合"怎么理解。。。有没字符串个数限制?能否出现重复字符串??
不同的需求写出的代码是完全不同的。。。最简单的一种情况就是固定字符串个数,并允许出现重复~~
作者:
hsjzfling
时间:
2008-5-4 19:59
下班回家顺便写了个全排列的函数
输入参数为一个字符串数组,返回值是该数组所有元素的全排列数组
例如:
MyArray=GetAllPermutation(Array("a","b","cd","123","jkl","!@#"))
那么MyArray(0)值应该是"abcd123jkl!@#"而MyArray(719)值就是[email=!@#jkl123cdba]!@#jkl123cdba[/email]
程序的逻辑很简单,就是循环去取N位,不过就是易读性很糟糕~~
一会写个递归的,那个看起来比较清晰。
Function GetAllPermutation(sArr0)
Dim sLen,s,aLen,i,counter
sLen=UBound(sArr0)+1
aLen=Factorial(sLen)
s="Dim cArr("&aLen&")"
Execute s
s="counter=0:"
For i=0 To sLen-2
s=s&"For i"&i&"=0 To "&sLen-1-i&":sArr"&i+1&"=RemoveFromArray(sArr"&i&",i"&i&"):"
Next
s=s&"cArr(counter)="
For i=0 To sLen-2
s=s&"sArr"&i&"(i"&i&")&"
Next
s=s&"sArr"&i&"(0):counter=counter+1:"
For i=0 To sLen-2
s=s&"Next:"
Next
Execute s
GetAllPermutation=cArr
End Function
Function RemoveFromArray(ByVal arr,index)
Dim sTemp,arrTemp
arr(index)=""
sTemp=Join(arr,"|")
If Left(sTemp,1)="|" Then
sTemp=Right(sTemp,Len(sTemp)-1)
ElseIf Right(sTemp,1)="|" Then
sTemp=Left(sTemp,Len(sTemp)-1)
Else
sTemp=Replace(sTemp,"||","|")
End If
arrTemp=Split(sTemp,"|")
RemoveFromArray=arrTemp
End Function
Function Factorial(num)
Dim n,product
product=1
For n=2 To num
product=product*n
Next
Factorial=product
End Function
复制代码
[
本帖最后由 hsjzfling 于 2008-5-4 21:28 编辑
]
作者:
hsjzfling
时间:
2008-5-4 21:33
这个是使用递归的,也是返回全排列,看起来应该是比之前那个动态生成代码的要清楚多了,用法都一样~
Function GetAllPermutation(ByVal sArr)
sLen=UBound(sArr)+1
aLen=Factorial(sLen)
s="Dim aResult("&aLen&")"
Execute s
Call GetString(sArr,"",aResult,0)
GetFullPermutation=aResult
End Function
Function GetString(ByVal aTemp,ByVal strTemp,ByRef aResult,ByRef counter)
Dim i,str
If UBound(aTemp)>0 Then
For i=0 To UBound(aTemp)
str=strTemp&aTemp(i)
Call GetString(RemoveFromArray(aTemp,i),str,aResult,counter)
Next
Else
aResult(counter)=strTemp&aTemp(0)
counter=counter+1
End If
End Function
Function RemoveFromArray(ByVal arr,index)
Dim sTemp,arrTemp
arr(index)=""
sTemp=Join(arr,"|")
sTemp=Replace(sTemp,"||","|")
If Left(sTemp,1)="|" Then
sTemp=Right(sTemp,Len(sTemp)-1)
ElseIf Right(sTemp,1)="|" Then
sTemp=Left(sTemp,Len(sTemp)-1)
End If
arrTemp=Split(sTemp,"|")
RemoveFromArray=arrTemp
End Function
Function Factorial(num)
Dim n,product
product=1
For n=2 To num
product=product*n
Next
Factorial=product
End Function
复制代码
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2