递归,图片说明
每次将第一个字符与第i个字符对换,

for(int i = 0; i< str.length();i++){
    if(i == 0 || str.charAt(i) != str.charAt(0)){
        //将第一个字符与第i个字符对换
        char temp = str.charAt(i);
        str.setCharAt(i, str.charAt(0));
        str.setCharAt(0, str.charAt(i));
        ....
        //完事之后记得再将原来的字符调换回去
        str.setCharAt(0, str.charAt(i));
        str.setCharAt(i, temp);
    }
}

所以总体代码如下:

public ArrayList<String> Permutation(String str) {
        StringBuilder stringBuilder = new StringBuilder(str);
        ArrayList<String> result = permutationHelper(stringBuilder);
        for (String resultString :
                result) {
            System.out.println(resultString);
        }
        return result;
    }

    public ArrayList<String> permutationHelper(StringBuilder str){
        ArrayList<String> result = new ArrayList<>();
        if (str.length() == 1){
            result.add(str.toString());
        }else {
            for (int i = 0; i < str.length(); i++) {
                if (i == 0 || str.charAt(i) != str.charAt(0)){
                    char temp = str.charAt(i);
                    str.setCharAt(i, str.charAt(0));
                    str.setCharAt(0, str.charAt(i));
                    ArrayList<String> newResult = permutationHelper(new StringBuilder(str.substring(1)));
                    for (String resultString :
                            newResult) {
                        result.add(temp+resultString);
                    }
                    str.setCharAt(0, str.charAt(i));
                    str.setCharAt(i, temp);
                }
            }
        }
        return result;
    }