剑指Offer 38.字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列,不能重复
示例:输入 s = “abc”
输出 [“abc”, “acb”, “bac”, “bca”, “cab”, “cba”]
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
class Solution {
List<String> result = new LinkedList<>(); //用于存放结果
char [] c; //用于存放字符串s中每一个字符,并且用于得到每一种排序
public String[] permutation(String s) {
c = s.toCharArray(); //初始化c
dfs(0); //从第0层开始循环
return result.toArray(new String[result.size()]); //得到结果
}
private void dfs(int index) {
if(index == c.length - 1) { //此时遍历到最后一个字符,将新得到的字符序列转成字符串并且加入list中
result.add(String.valueOf(c));
return;
}
HashSet<Character> set = new HashSet<>(); //用于判断当前遍历到的字符是否与固定位字符相同
for(int i = index; i < c.length; i++) {
if(set.contains(c[i])) continue; //若相同则结束当前循环
set.add(c[i]); //将字符加入集合中
swap(i , index); //交换两个字符
dfs(index + 1); //进入下一层循环
swap(i , index); //还原至上一次交换前的顺序
}
}
private void swap(int x, int y) { //交换两个字符的位置
char middle = c[x];
c[x] = c[y];
c[y] = middle;
}
}
public class test {
public static void main(String [] args) {
// long startTime = System.currentTimeMillis(); //获取开始时间
String [] result = new Solution().permutation("abc");
// long endTime = System.currentTimeMillis(); //获取结束时间
// System.out.println("用时:" + (endTime - startTime));
// for (String r :
// result) {
// System.out.print(r + " ");
// }
}
}