剑指 Offer 38. 字符串的排列

 又是一个回溯法的题目,但难度更大了,很多地方容易出错

主要是多了可能的重复

二是字符数组和字符串的转换问题

这题的核心在于交换,我们可以想象为

确认第一位的值,就是将第1位和其他所有位做交换,做完交换后的后面的元素就是剩下的可选列表

去重时则需要使用到HashSet

“这个技巧应该之前的数字排列的回溯法题都能用”,比修改选择列表和路径/把路径弄成HashSet都要省时间

class Solution {
    List<String> res=new LinkedList<>();//结果,先用集合框架存储
    public String[] permutation(String s) {
        char[] charArray=s.toCharArray();
        backtracking(charArray,0);
        return res.toArray(new String[res.size()]);
    }

    private void backtracking(char[] chars,int indexFrom)
    {
        //返回条件
        if(indexFrom==chars.length-1)
        {
            res.add(String.valueOf(chars));//字符数组转字符串
            return;
        }


        Set<Character> charSet=new HashSet<>();
        int length=chars.length;//是.length
        for(int i=indexFrom;i<length;i++)
        {
            // if(charSet.contains(char[])) 怎么去重?
            if(charSet.contains(chars[i]))
            {
                continue;
            }
            charSet.add(chars[i]);
            swap(chars,indexFrom,i);
            backtracking(chars,indexFrom+1);//数组不会越界
            swap(chars,indexFrom,i);
        }
    }

    private void swap(char[] chars,int indexFrom,int indexTo)//交换指定位置字符
    {
        char temp=chars[indexFrom];
        chars[indexFrom]=chars[indexTo];
        chars[indexTo]=temp;
    }
}

注意字符数组和字符串的转换:

char[] charSet={'a','b'};
String str=String.valueOf(charSet);//字符数组转字符串

String str1="sdfd";
char[] charSet1=str1.toCharArray();//字符串转字符数组

注意集合转数组

return res.toArray(new String[res.size()])

这样转成数组后才是有泛型的,如果是return res.toArray(); 则是一个Object类型的数组

原文地址:https://www.cnblogs.com/take-it-easy/p/14506719.html