找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 45116|回复: 27

字符串全排列

[复制链接]
发表于 2017-4-7 21:08:08 | 显示全部楼层 |阅读模式
本帖最后由 happy886rr 于 2017-4-8 09:38 编辑

字符串 def 的全排列为:def、dfe、edf、efd、fde、fed。那么字符串bathome的全排列是?
(不限编程语言,能输出正确的全排列即可,代码越少越好。)

示例代码: C
  1. #include <stdio.h>
  2. #include <string.h>

  3. void swap(char *a, char *b)
  4. {
  5.       char tmp = *a;
  6.       *a = *b;
  7.       *b = tmp;
  8. }

  9. void arrange(char *str, int start, int end)
  10. {
  11.       int i;
  12.       if(start == end)
  13.       {
  14.             printf("%s\n",str);

  15.       }else{
  16.             for(i = start; i < end; i++)
  17.             {
  18.                   swap(str+start,str+i);
  19.                   arrange(str,start+1,end);
  20.                   swap(str+start,str+i);
  21.             }

  22.       }
  23. }

  24. int main(void)
  25. {
  26.       char str[10]="bathome";
  27.       int len = strlen(str);
  28.       arrange(str,0,len);
  29.       return 0;
  30. }
复制代码
示例代码: js混编
  1. 1>1/* :
  2. @echo off
  3. cscript -nologo -e:jscript "%~f0"  %*
  4. pause&exit /b
  5. */

  6. permutations('bathome'.split(''));

  7. function permutations(arr)
  8. {  
  9.         (function exfn(source, result)
  10.         {  
  11.                 if(source.length == 0){
  12.                         WSH.echo(result.join(''));
  13.                 }else{
  14.                         for (var i=0; i<source.length; i++){
  15.                                 exfn(source.slice(0, i).concat(source.slice(i+1)), result.concat(source[i]));
  16.                         }
  17.                 }
  18.         })(arr, []);  
  19. }
复制代码

评分

参与人数 3PB +6 技术 +3 收起 理由
老刘1号 + 1 6
523066680 + 6 + 1 现在看这段递归代码,很有深度
taofan712 + 1 请继续出题。

查看全部评分

发表于 2017-4-7 22:13:58 | 显示全部楼层
每次看到这话题,总想安利一下 plp626 那神一样的纯批解:
http://bbs.bathome.net/redirect. ... 11959&pid=76175
 楼主| 发表于 2017-4-7 23:10:43 | 显示全部楼层
回复 2# CrLf
plp这个也太牛了吧,骨瘦如柴啊。
  1. setlocal&set "s=%~1 "&if "!s: =!" == ""  (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"
复制代码
感觉他是在写诗。
发表于 2017-4-7 23:28:33 | 显示全部楼层
本帖最后由 codegay 于 2017-4-7 23:40 编辑

我只知道这么写:
python3
  1. from itertools import permutations as pm

  2. for r in pm("bathome"):
  3.     print(''.join(r))
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 666

查看全部评分

发表于 2017-4-7 23:29:19 | 显示全部楼层
没有内置类库我大约不会写。
 楼主| 发表于 2017-4-7 23:41:41 | 显示全部楼层
回复 5# codegay
非常短,这次代码数你的最短,最好。因为题目不限语言。你几乎胜了。
发表于 2017-4-8 00:50:32 | 显示全部楼层
  1. function arrange(str) {
  2.     str = str + '';
  3.     if (str.length <= 1) {
  4.         return [str];
  5.     }
  6.     var aStrRest = arrange(str.slice(1));
  7.     var sFirst = str.charAt(0);
  8.     var item;
  9.     var aReturn = [];
  10.     for (var i = 0, l = aStrRest.length; i < l; i++) {
  11.         item = aStrRest[i];
  12.         for (var j = 0, litem = item.length; j <= litem; j++) {
  13.             aReturn.push(item.slice(0, j) + sFirst + item.slice(j));
  14.         }
  15.     }
  16.     return aReturn;
  17. }
  18. console.log(arrange('bathome').join('\n'));
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 666

查看全部评分

发表于 2017-4-8 01:13:29 | 显示全部楼层
本帖最后由 a20150604 于 2017-4-8 02:27 编辑

追求高效的纯批置换算法: 从生成一个元素的全排列, 逐次进阶扩展到 2, 3, .... 个元素, 排除命令行窗口显示耗时, 仅数据生成时间 < 1秒 (i3 处理器)
  1. @echo off & setlocal enabledelayedexpansion & mode 160, 1000
  2. set z=1;
  3. set z
  4. for /L %%j in (2 1 6) do (
  5.     set /a k=%%j-1
  6.     set x=
  7.     for /L %%i in (1 1 !k!) do (
  8.         set t=!z:%%i=%%j!
  9.         set x=!x!!t:;=%%i;!
  10.     )
  11.     set z=!z:;=%%j;!!x!
  12.     set z
  13. )
  14. echo;complete 6

  15. REM 7个元素的全排列用带分隔符的单变量存储超出批处理变量存储极限, 只能另行处理
  16. REM 数字形式
  17. REM echo;!z:;=7;!
  18. REM for /L %%i in (1 1 6) do (
  19.     REM set t=!z:%%i=7!
  20.     REM echo;!t:;=%%i;!
  21. REM )

  22. set t7=!z:;=e;!
  23. for /L %%i in (1 1 6) do (
  24.     set t%%i=!z:%%i=e!
  25.     set t%%i=!t%%i:;=%%i;!
  26. )
  27. for /L %%i in (1 1 7) do (
  28.     for %%Q in (1:b 2:a 3:t 4:h 5:o 6:m) do for /f "tokens=1-2 delims=:" %%W in ("%%Q") do set t%%i=!t%%i:%%W=%%X!
  29.     echo;!t%%i:;= !
  30. )

  31. echo;complete 7
  32. pause
  33. exit
复制代码

评分

参与人数 4PB +6 技术 +4 收起 理由
flashercs + 1 bathome换成7654321结果不对了
taofan712 + 1 学习了。
523066680 + 6 + 1 服这一个
happy886rr + 1 你这比C语言都快那,神!

查看全部评分

发表于 2017-4-8 01:52:54 | 显示全部楼层
本帖最后由 a20150604 于 2017-4-8 02:56 编辑

Wolfram 语言
  1. Permutations[{b,a,t,h,o,m,e}]
复制代码
格式处理一下
  1. StringJoin /@ Permutations[Characters["bathome"]]
复制代码

评分

参与人数 2技术 +2 收起 理由
happy886rr + 1 真短,貌似你赢了。看看后边的坛友还有更短 ...
codegay + 1 1

查看全部评分

发表于 2017-4-8 04:42:34 | 显示全部楼层
最近论坛新来的几个ID技术都很不错啊。
发表于 2017-4-8 06:59:50 | 显示全部楼层
  1. @echo off
  2. REM %str%为要排列的字符串,但不能含"^
  3. set "str=|&<>bat"
  4. call :arrange "%str%"
  5. pause
  6. exit /b
  7. :arrange
  8. setlocal
  9. set "s=%~1"
  10. if not defined s (
  11.     call :escape "%~2"
  12.     call echo,%%r%%
  13.     goto end
  14. )
  15. set /a "n=0"
  16. :loop
  17. set /a "m=n+1"
  18. call set "pre=%%s:~%n%,1%%"
  19. call set "rest=%%s:~,%n%%%%%s:~%m%%%"
  20. if not defined pre goto end
  21. call :arrange "%rest%" "%~2%pre%"
  22. set /a "n+=1"
  23. goto loop
  24. :end
  25. endlocal
  26. exit /b
  27. :escape
  28. set "r=%~1"
  29. set "r=%r:^=^^%"
  30. set "r=%r:&=^&%"
  31. set "r=%r:|=^|%"
  32. set "r=%r:<=^<%"
  33. set "r=%r:>=^>%"
  34. set "r=%r:"=^"%"
  35. exit /b
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 运行正确

查看全部评分

 楼主| 发表于 2017-4-8 08:57:41 | 显示全部楼层
回复 10# codegay
藏龙卧虎啊,你不出点题,他们怎能显山露水。
发表于 2017-4-8 09:16:43 | 显示全部楼层
本帖最后由 pcl_test 于 2017-4-8 09:30 编辑

  1. @echo off
  2. powershell ^
  3.         function perm($str, $t){^
  4.                 $len=$str.length;^
  5.                 if($len -le 1){$t+''+$str}else{^
  6.                 for($i=0; $i -lt $len; ++$i)^
  7.                 {^
  8.                         perm ($str.Substring(0, $i)+''+$str.Substring($i+1, $len-$i-1)) ($t+''+$str[$i]);^
  9.                 }}^
  10.         }^
  11.         perm 'bathome';
  12. pause
复制代码

评分

参与人数 2技术 +2 收起 理由
codegay + 1 1
happy886rr + 1 运行完美

查看全部评分

发表于 2017-4-8 11:01:38 | 显示全部楼层
回复 1# happy886rr


    为什么你这算法的数组操作35ms完成,而我字符串操作7ms完成,为什么数组会慢 这么多?不合理啊!!
发表于 2017-4-8 11:20:35 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:45 , Processed in 0.026401 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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