给定一个字符串,输出其所有的全排列
思路:
- 假设字符串的长度为1,则输出该字符
- 假设字符串的长度为2,则交换字符1和字符2
- 假设字符串的长度为n,则交换字符1和字符i(1<i<n) 剩下的长度为n-1的字符串继续用该方法进行递归。
代码实现:
package com.hy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution5{
public static ArrayList<String> Permutation(String str) {
a ArrayList<String > list=new ArrayList<String>();
char[] arr = str.toCharArray();
func(arr,0,list);
return list;
}
/**
* @param arr 需要全排列的数组
* @param i 标记数组当前位置
*/
private static void func(char[] arr, int index,ArrayList<String > list) {
// TODO Auto-generated method stub
if(index==arr.length-1) {
list.add(new String(arr));
}else {
//验证是否有重复元素
List< Character> exis = new ArrayList< Character>();
for(int i=index;i<arr.length;i++) {
if(!exis.contains(arr[i])){
exis.add(arr[i]);
//交换
char temp=arr[index]; arr[index]=arr[i];arr[i]=temp;
//递归
func(arr, index+1,list);
//换回来
temp=arr[index]; arr[index]=arr[i];arr[i]=temp;
}
}
}
}
public static void main(String[] args) {
String str="abcde";
ArrayList<String> list2 = Permutation(str);
list2.forEach(System.out::println);
System.out.println(list2.size());
}
}
结果:
abc
acb
bac
bca
cba
cab
6