经典面试题之字符串的全排列
2016-08-31 16:47
323 查看
1.题目描述
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,输出abc,acb,bac,bca,cab和cba2.问题分析
这个问题我们一开始看起来会比较困难,但是如果仔细分析一下排列的实质,或许很快会有思路。我们来看排列的实质,字符串的abc第一个字符分别与后边的字符(含自己)交换可以得到abc,bac,cba,然后对这每一个字符串从第二个字符分别与后边的字符(含自己)交换可以得到abc,acb,bac,bca,cba,cab,依此下去,最后就输出了abc,acb,bac,bca,cab和cba。那么这个问题如果我们按照这个思路来做的话,必然就是递归+回溯。3.代码实现
public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String str=sc.nextLine(); int n=str.length(); char[] arr=new char ; for(int i=0;i
4.问题扩展
如果字符串中存在重复字符呢?明显上述代码就不成立了,为什么呢?如果有重复字符,与相同字符的交换输出结果必定有重复,所以我们对于相同的字符应该只交换一次,实际上我们可以增加一个数组,记录与当前位置字符交换过的字符,每次交换前都要进行判断,如果要交换的字符已经不存在该数组,才进行交换。改进的代码:
public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String str=sc.nextLine(); int n=str.length(); char[] arr=new char ; for(int i=0;i
输入:accc
输出:accc
cacc
ccac
ccca
相关文章推荐
- 半吊子程序员
- 寻找大小为n的数组中出现次数超过n/2的那个数 (美团面试题)
- 剑指offer面试题 java解答61-65
- 面试题
- 小白的一些面试题总结。
- Java线程面试题 Top 50
- To Java程序员:切勿用普通for循环遍历LinkedList
- 综合基础
- 想转行做程序员,该如何自学技术?
- 让你变成优秀程序员的几个小习惯
- Java程序员最喜爱的4款IDE
- 程序员不得不知的座右铭(中国篇)
- 909422229__送给程序员最近天气炎热咽喉疼感冒的兄弟们
- 程序员的十层楼(十种境界
- Java程序员必须掌握的8大排序算法
- 程序员用上这个模板,bug少了90%
- 由Integer封装与拆箱引申出的java面试题
- 应届毕业生(程序员)如何工作更顺利、步步高升
- !! 浅谈Java学习方法和后期面试技巧
- 中远集团前端面试笔试题回忆