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位,不过就是易读性很糟糕~~
一会写个递归的,那个看起来比较清晰。

  1. Function GetAllPermutation(sArr0)
  2. Dim sLen,s,aLen,i,counter
  3. sLen=UBound(sArr0)+1
  4. aLen=Factorial(sLen)
  5. s="Dim cArr("&aLen&")"
  6. Execute s

  7. s="counter=0:"
  8. For i=0 To sLen-2
  9.   s=s&"For i"&i&"=0 To "&sLen-1-i&":sArr"&i+1&"=RemoveFromArray(sArr"&i&",i"&i&"):"
  10. Next
  11. s=s&"cArr(counter)="
  12. For i=0 To sLen-2
  13.   s=s&"sArr"&i&"(i"&i&")&"
  14. Next
  15. s=s&"sArr"&i&"(0):counter=counter+1:"
  16. For i=0 To sLen-2
  17.   s=s&"Next:"
  18. Next

  19. Execute s
  20. GetAllPermutation=cArr
  21. End Function

  22. Function RemoveFromArray(ByVal arr,index)
  23. Dim sTemp,arrTemp
  24. arr(index)=""
  25. sTemp=Join(arr,"|")
  26. If Left(sTemp,1)="|" Then
  27.   sTemp=Right(sTemp,Len(sTemp)-1)
  28. ElseIf Right(sTemp,1)="|" Then
  29.   sTemp=Left(sTemp,Len(sTemp)-1)
  30. Else
  31.   sTemp=Replace(sTemp,"||","|")
  32. End If
  33. arrTemp=Split(sTemp,"|")
  34. RemoveFromArray=arrTemp
  35. End Function

  36. Function Factorial(num)
  37. Dim n,product
  38. product=1
  39. For n=2 To num
  40.   product=product*n
  41. Next
  42. Factorial=product
  43. End Function
复制代码

[ 本帖最后由 hsjzfling 于 2008-5-4 21:28 编辑 ]
作者: hsjzfling    时间: 2008-5-4 21:33
这个是使用递归的,也是返回全排列,看起来应该是比之前那个动态生成代码的要清楚多了,用法都一样~

  1. Function GetAllPermutation(ByVal sArr)
  2. sLen=UBound(sArr)+1
  3. aLen=Factorial(sLen)
  4. s="Dim aResult("&aLen&")"
  5. Execute s
  6. Call GetString(sArr,"",aResult,0)
  7. GetFullPermutation=aResult
  8. End Function  

  9. Function GetString(ByVal aTemp,ByVal strTemp,ByRef aResult,ByRef counter)
  10. Dim i,str
  11. If UBound(aTemp)>0 Then
  12.   For i=0 To UBound(aTemp)
  13.    str=strTemp&aTemp(i)
  14.    Call GetString(RemoveFromArray(aTemp,i),str,aResult,counter)
  15.   Next
  16. Else
  17.   aResult(counter)=strTemp&aTemp(0)
  18.   counter=counter+1
  19. End If
  20. End Function

  21. Function RemoveFromArray(ByVal arr,index)
  22. Dim sTemp,arrTemp
  23. arr(index)=""
  24. sTemp=Join(arr,"|")
  25. sTemp=Replace(sTemp,"||","|")
  26. If Left(sTemp,1)="|" Then
  27.   sTemp=Right(sTemp,Len(sTemp)-1)
  28. ElseIf Right(sTemp,1)="|" Then
  29.   sTemp=Left(sTemp,Len(sTemp)-1)  
  30. End If
  31. arrTemp=Split(sTemp,"|")
  32. RemoveFromArray=arrTemp
  33. End Function

  34. Function Factorial(num)
  35. Dim n,product
  36. product=1
  37. For n=2 To num
  38.   product=product*n
  39. Next
  40. Factorial=product
  41. End Function
复制代码





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2