一、题目描述
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
数据范围:n < 10n<10
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)
输入描述:
输入一个字符串,长度不超过10,字符只包括大小写字母。
二、思路
①先确定以那个字符开头
②剩下的都是子问题
注意!!!
要让每个字符都做一遍开头,然后后面的字符不能是前面出现过的!
三、代码实现:
import java.util.*;
public class Solution {
public void Swap(char[] str,int start,int end){ //不会出现字符重复的情况
char tmp = str[start];
str[start] = str[end];
str[end] = tmp;
}
public boolean IsExist(ArrayList<String> ret,char[] str){
return ret.contains(String.valueOf(str));
}
public void PermutationHelper(char[] str,int start,ArrayList<String> ret){
if(start == str.length-1){//说明起始位置是最后一个一个字符了
//应该是叶子结点了,不需要再排列了
if(!IsExist(ret,str)){
ret.add(new String(str));
}
return;//结束这个函数
}
//start永远代表的是第一个元素
for( int i = start;i < str.length;i++){
Swap(str,start,i);
PermutationHelper(str,start+1,ret);//i开头的可能性全部保存到了ret中
Swap(str,start,i);//恢复回来 abc
}
}
public ArrayList<String> Permutation(String str) {
//创建结果集容器
ArrayList<String> ret = new ArrayList<>();
if(str != null && str.length() > 0){
// 0 当前字符串的零下标元素
PermutationHelper(str.toCharArray(),0,ret);
//直接应用底层函数翻转
Collections.sort(ret);
}
return ret;
}
}