《剑指offer》刷题——【分解让复杂问题简单化】面试题38:字符串的排列(java实现)
一、题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串
abc,acb,bac,bca,cab和cba。
二、题目分析
- 把一个字符串看成两部分:1)第一个字符;2)后面所有的字符
- 先求出所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换
- 固定第一个字符,求后面所有字符的排列
- 求后面的字符依旧分成第一个字符和后边的所有字符
- 以此递归,直到最后只剩下最后一个字
参考牛客
- 找全排列类似于深度优先遍历,深度优先最关键的就是要记住上一个状态,而所谓回溯就是要回到上一没有操作过的状态,再去考虑别的情况。上图每次都把一个数固定在前面,让后面的数递归地进行全排列,这样每个数都固定过以后就能找出所有排列。关键的地方在于,我们把每个数固定在前面并让后面的进行全排列完毕以后,要恢复原来的状态,也就需要交换回来。
三、代码实现
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<>();
if(str !=null || str.length()>0){
help(0,str.toCharArray(),result);
Collections.sort(result);
}
return result;
}
public static void help(int i, char[] cha, ArrayList<String> result){
if(i==cha.length-1){
String val = String.valueOf(cha);
if(!result.contains(val)){
result.add(val);
}
}
else{
for(int j=i; j<cha.length; j++){
swap(i,j,cha);
help(i+1, cha, result);
swap(i,j,cha);
}
}
}
public static void swap(int i, int j, char[] cha){
char temp = cha[i];
cha[i] = cha[j];
cha[j] = temp;
}
}
参考博文
四、完整代码及扩展代码
package Permutation;
import java.util.*;
public class PermutationString {
public void Permutation(String str) {
char[] arrays=str.toCharArray();
permutation(arrays,0,arrays.length);
}
private void permutation(char[] arrays,int start,int length) {
if (length==1)
{System.out.println(Arrays.toString(arrays));}
else{
for(int i=start;i<start+length;i++){
swap(arrays,start,i);
permutation(arrays,start+1,length-1);
swap(arrays,start,i);
}
}
}
private void swap(char[] arrays, int start, int i) {
char temp=arrays[start];
arrays[start]=arrays[i];
arrays[i]=temp;
}
public static void main(String[] args) {
PermutationString one=new PermutationString();
one.Permutation("abc");
}
}
package Permutation;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class PermutaionRanNum {
private static void Combination(char[] chs, int m, int pos, List<Character> list){
if(chs==null){
return;
}
if(m==0){
System.out.println(list.toString());
return;
}
if(pos==chs.length){
return;
}
list.add(chs[pos]);
Combination(chs,m-1,pos+1,list);
list.remove((Character)chs[pos]);
Combination(chs,m,pos+1,list);
}
public static void main(String[] args) {
System.out.print("Please input string:");
String str = new Scanner(System.in).next();
char[] chs = str.toCharArray();
List list = new ArrayList<Character>();
for(int m=1;m<=chs.length;m++){
Combination(chs,m,0,list);
}
}
}