方法一:利用递归

利用递归求全排列的过程真的很难理解,先把代码贴上来吧

function Permutation(str)
{// write code hereif(!str){return str;}let len=str.length,result=[];str=str.split('');// 字符串的索引属性都是只读,后面要交换两个字符的话还是要先把字符串转化为数组str.sort();// 直接把字符串按字典序排列了,后面求全排列时也会按照字典序Permutate(str,0);result=[...new Set(result)];// 这里是通过Set的特性去重,处理字符串中有重复字符的情况return result.toString();// 最后输出的还是字符串function Permutate(str,index) {if(index===str.length){let s='';for(let i=0;i<str.length;i++){s+=str[i];}// 这里是把数组重新转回字符串result.push(s);} else {for(let i=index;i<str.length;i++){[str[index],str[i]]=[str[i],str[index]];Permutate(str,index+1);}}}
}

里面有几个坑要注意,一是通过字符串索引是不能修改字符串的,因此还是要把字符串转化为数组;二是注意对重复字符的处理

方法二:回溯法

回溯法相对来说更好理解一些,实际上就是对排列结果的每一位遍历可能的取值。比如首先看第一位,它可能取到字符串里的每一个不重复字符,那么就遍历字符串按顺序把每个字符都安到第一位上。如果第一位取到了a,那么再看第二位,就是从除去a的剩下的字符里面取。如果字符全部被取完了,那么将这个排列压入结果数组里,然后回溯到上一位。而且这个时候也要回复到上一位的状态,就是把最后选择的那个字符从排列里去掉,重新压回剩余字符里。

function Permutation2(str){// write code hereif(!str){return str;}let len=str.length,result=[],s='';str=str.split('');str.sort();Permutate(str);result=[...new Set(result)];return result.toString();function Permutate(str) {if(str.length===0){result.push(s);}else{let marked=new Set();for (let i=0;i<str.length;i++){if (!marked.has([str[i]])){let char=str.splice(i,1);s+=char;Permutate(str);str.splice(i,0,char);//把取的字符重新压回剩余字符里s=s.slice(0,s.length-1);//把取的字符从排列结果里删除marked.add(char);//标记该字符已经被取过了}}}}
}

转载于:https://www.cnblogs.com/huangrui-dori/p/10660269.html

【20190405】算法-输入一个字符串,按字典序打印出该字符串中字符的所有排列相关推荐

  1. java从键盘输入数据斐波那契数_从键盘输入一个正整数n,打印出斐波那契数列的前n个元素...

    import java.util.*; public class Test { public static void main(String[] args){ Scanner in = new Sca ...

  2. c语言输入一段字符,C语言实现输入一个字符串后打印出该字符串中字符的所有排列...

    本文实例讲述了C语言实现输入一个字符串后打印出该字符串中字符的所有排列的方法,属于数学里的排列问题.是一个很实用的算法技巧.分享给大家供大家参考.具体实现方法如下: 例如输入字符串abc,则输出由字符 ...

  3. 本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符

    本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符 函数接口定义: char *match( char *s, c ...

  4. 【C/C++】输入一个整数的二目运算式的字符串,如100+20,332-19,200*2333,44/33二目运算取”加减乘除“中的一种输出运算式的整数结果值

    输入一个整数的二目运算式的字符串,如100+20,332-19,200*2333,44/33 二目运算取"加减乘除"中的一种 输出运算式的整数结果值 输入:"%s&quo ...

  5. 打印给定字符串中字符的所有排列

    题目: 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 解决: 简单起见,字符串中 ...

  6. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示

    转自http://my.oschina.net/ithaibo/blog/142655 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目引自http://ac.jobdu ...

  7. Java1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4.至少使用两种方法进行编程,直接查

    1.使用二分搜索算法查找任意N个有序数列中的指定元素. 2.通过上机实验进行算法实现. 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告. 4.至少使用两种方法进行编程,直接查找/递归 ...

  8. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。...

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  9. 找不同(给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。)

    给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = "abcd&quo ...

最新文章

  1. python list转字符串_我用python写了个自动生成给文档生成索引的脚本!懒人智慧...
  2. linux ubuntu pkg-config工具的使用(源代码编译库接口查询工具)
  3. 国外学python的软件_全球开发者调查报告:IT人最想学习 Go 和 Python、美国开发者收入最高...
  4. 测试插件-infinitest介绍
  5. java能过吗_java – 你能通过例子解释AspectJ的cFlow(P u00...
  6. java键盘事件键值表_Java的20年:重大事件的时间表
  7. Facebook 游戏开发更新文档 API 参考文档 v6.0
  8. java peek方法_Java ArrayDeque peek()方法与示例
  9. php输出一条直线,Photoshop脚本 绘制一条线
  10. matplotlib中改变字体的方法
  11. ai怎么调界面大小_Illustrator怎么设置调整界面网格呢?
  12. 开源的胜利:意大利法院判定开源协议条款可强制执行
  13. Springboot毕设项目会议预约系统设计与实现3if68(java+VUE+Mybatis+Maven+Mysql)
  14. OPA(运放)与MOS管组成的恒流源电路
  15. 抖音育儿类账号的创作灵感分享, 想进圈的不妨了解一下
  16. explain ref_面试前一定要知道的MySQL命令【explain】
  17. 好的重疾险原来长这样!你被骗了这么多年...
  18. 【学习资料】VMware安装到Linux系统安装全过程2021版 【手把手教,包教包会】
  19. cf103202M. United in Stormwind
  20. C++常用字符串string方法

热门文章

  1. EasyX 图片透明设置
  2. 计算机程序设计员英语单词,计算机程序设计员个人英文简历
  3. pixfllow光流传感器数据获取及悬停程序编写
  4. 生产系统执行下线操作--泪奔
  5. 语音控制,让家居听你的话
  6. 使用哈尔滨工业大学SCIR的开源代码训练自己的ELMo
  7. 余文乐结婚,杜蕾斯文案炸了!
  8. 单核CPU能够实现并行么?
  9. 推特Twitter高级搜索
  10. 如何用 Python 识别车牌