[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

字符串全排列

本帖最后由 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. }
复制代码
3

评分人数

每次看到这话题,总想安利一下 plp626 那神一样的纯批解:
http://bbs.bathome.net/redirect. ... 11959&pid=76175

TOP

回复 2# CrLf
plp这个也太牛了吧,骨瘦如柴啊。
  1. setlocal&set "s=%~1 "&if "!s: =!" == ""  (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"
复制代码
感觉他是在写诗。

TOP

本帖最后由 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

评分人数

去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

没有内置类库我大约不会写。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 5# codegay
非常短,这次代码数你的最短,最好。因为题目不限语言。你几乎胜了。

TOP

  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

评分人数

TOP

本帖最后由 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
复制代码
4

评分人数

TOP

本帖最后由 a20150604 于 2017-4-8 02:56 编辑

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

评分人数

    • happy886rr: 真短,貌似你赢了。看看后边的坛友还有更短 ...技术 + 1
    • codegay: 1技术 + 1

TOP

最近论坛新来的几个ID技术都很不错啊。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

  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

评分人数

TOP

回复 10# codegay
藏龙卧虎啊,你不出点题,他们怎能显山露水。

TOP

本帖最后由 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

评分人数

TOP

回复 1# happy886rr


    为什么你这算法的数组操作35ms完成,而我字符串操作7ms完成,为什么数组会慢 这么多?不合理啊!!

TOP

TOP

返回列表