51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1711|回复: 5
打印 上一主题 下一主题

[原创] 求高手指教:生成字串的所有可能组合

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-5-3 21:37:55 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
生成下面字串的所有可能组合:

“E”,”F”,”IJK”, “9”, “87”, “KM”
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

6#
发表于 2008-5-4 21:33:45 | 只看该作者
这个是使用递归的,也是返回全排列,看起来应该是比之前那个动态生成代码的要清楚多了,用法都一样~

  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
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2008-5-4 19:59: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 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2008-5-4 14:43:32 | 只看该作者
这个。。。"生成字串的所有可能组合"怎么理解。。。有没字符串个数限制?能否出现重复字符串??
不同的需求写出的代码是完全不同的。。。最简单的一种情况就是固定字符串个数,并允许出现重复~~
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    3#
    发表于 2008-5-4 00:36:16 | 只看该作者
    提示一点:使用 Left、  Length等函数和  + 操作符,再加上一个循环语句,基本就可以实现了。具体只能由你自己去实现了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2#
     楼主| 发表于 2008-5-3 21:38:16 | 只看该作者
    请问一下,这段脚本应该怎么写?
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-8 09:26 , Processed in 0.071860 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表