题目分析:
- 首先题目中的字典序已经表明了结果是需要排序的;
- 结果中不能包含重复的字符串. 如果字符串中出现重复的字符, 比如: abbc, 那么在输出结果中像abbc,bacb这样的结果只能出现一次.
思路:
step1: 假设提取某一个字符之后, 剩下的子串可以用diGui(subStr)得到它的字典序的所有排列, 那么加上这个提取的字符作为首字符之后, 就得到了一组结果;
step2: 对于当前递归层, 给出的一个字符串, 只需要遍历所有字符, 分别提取所有没有提取过的字符做为首字符, 分别与剩下的子串拼接并加入到结果集中, 最后就可以得到想要的结果.
代码如下:
```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Solution {
public ArrayList<String> Permutation(String str) {
if (str==null || str.length()==0) return new ArrayList<>();
char[] chars = str.toCharArray();
Arrays.sort(chars);
return diGui(new String(chars));
}
private ArrayList<String> diGui(String str){
ArrayList<String> result = new ArrayList<>();
if(str.length() == 1){
result.add(str);
return result;
}
Set<Character> pickChars = new HashSet<>();
for(int i = 0; i < str.length(); i++){
// 遍历字符串, 从其中挑出第i个字符作为开头, 拼上剩下的字符串的字典排序结果
// 不要挑重复的字符
if(pickChars.add(str.charAt(i))){
ArrayList<String> newResult = diGui(str.substring(0,i)+str.substring(i+1));
for (String s : newResult) result.add(str.charAt(i) + s);
}
}
return result;
}}

京公网安备 11010502036488号