①、问题描述
- 给你一个字符串str,返回这个字符串的全部排列,比如:
- str = “abc”
- 返回,[abc , acb, bac, bca,cab,cba]
- 注意:如果字符串str里有重复字符呢?要求返回的全排列集合里不能存在重复字符串,比如:
- str = “aa”
- 返回,[aa]。而不是[aa, aa]
②、解题思路
- 这种求全排列的问题,最常见也是最容易想到的写法就是【暴力递归】
- 注意如果str里有重复字符,那么递归时需要做【剪枝】操作来保证结果集里不会有重复字符串
- 对于递归算法主要是【分析子问题】、【找到递归点】、【确定递归参数(需要几个参数、哪些是变参,哪些是不变参)】、【确定递归退出条件】,算法也比较简单,就直接上代码了
③、相关题目
④、代码
public class PermutationProblem {
public static void main(String[] args) {
List<String> list = findPermutation("aba");
System.out.println(list);
}
public static List<String> findPermutation(String str) {
if (str == null || str.length() < 1) {
return null;
}
List<String> resultList = new ArrayList<>();
process(str.toCharArray(), 0, resultList);
return resultList;
}
public static void process(char[] chars, int index, List<String> resList) {
if (index == chars.length) {
resList.add(new String(chars));
return;
}
int[] visited = new int[26];
for (int i = index; i < chars.length; i++) {
int position = chars[i] - 'a';
if (visited[position] != 0) {
continue;
}
visited[position] = 1;
swap(chars, i, index);
process(chars, index + 1, resList);
swap(chars, i, index);
}
}
private static void swap(char[] chars, int i, int j) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
}