按c++的思路写了遍java的代码,思路大都差不多(具体思路可以参见题解上各位大神好汉的题解,我就不当
搬运工了,只是把代码中一些地方稍加些通俗的注释,方便理解,加深记忆。

import java.util.ArrayList;
import java.util.*;
public class Solution {
    public void dfs(char[] cs,ArrayList<String> list,int s){
        int len=cs.length;
        if(s==len){
            list.add(String.valueOf(cs));
            return;
        }
        for(int i=s;i<len;i++){
            if(i!=s&&cs[i]==cs[s])continue;
            char c=cs[i];//原谅我不知道如何使用java中字符串怎么交换,使用SwapUtil(cs,i,s)发现抱错,就采用原始的交换了
            cs[i]=cs[s];
            cs[s]=c;
            dfs(cs,list,s+1);
             c=cs[i];//递归算法中经典的剪枝操作,目的是为了去重
            cs[i]=cs[s];
            cs[s]=c;
        }
    }
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> list=new ArrayList<String>();
        if(str.length()>0){
           dfs(str.toCharArray(),list,0);
           Collections.sort(list);//得到的结果并不是按照字典排序,所以在此加了一个字典排序
       }
        return list;
    }
}