/**
思路:a b c
使用的递归思路
1,先确定第一个数a,剩余bc
2,再确定第二个数b,剩余c
3,判断就剩一个数了,把路径存起来
思路还挺好想,主要是怎么写代码。看下面吧,不太好讲。
*/
public class Solution {
public ArrayList<String> list = new ArrayList();
public ArrayList<String> Permutation(String str) {
if(str == null || str.length() == 0){
return list;
}
// str 转 list
String[] strArray = str.split("");
ArrayList<String> strlist = new ArrayList();
for (String s : strArray) {
strlist.add(s);
}
StringBuilder sb = new StringBuilder();
this.add(strlist, sb);
return list;
}
public void add(ArrayList<String> str, StringBuilder sb){
// 当等于str大小是1时,说明遍历到最后一个元素,存到list
if(str.size() == 1){
sb.append(str.get(0));
// 判断list中是否有重复,去重
int i = list.indexOf(sb.toString());
if(i == -1){
list.add(sb.toString());
}
return;
}
// 遍历所有可能情况 abc
for (int i = 0; i<str.size(); i++) {
StringBuilder newSb = new StringBuilder();
// 把之前路径存下
newSb.append(sb.toString());
// 存当前元素a/b/c
newSb.append(str.get(i));
// 确定a/b/c后,删除,下次递归使用剩余元素
ArrayList<String> temp = new ArrayList(str);
temp.remove(i);
this.add(temp, newSb);
}
}
}