经典面试题之字符串的全排列

1.题目描述

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,输出abc,acb,bac,bca,cab和cba


2.问题分析

这个问题我们一开始看起来会比较困难,但是如果仔细分析一下排列的实质,或许很快会有思路。我们来看排列的实质,字符串的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[n];
		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[n];
		for(int i=0;i

输入:accc
输出:accc
           cacc
           ccac
           ccca

你可能感兴趣的:(算法练习)