字符串全排序

给定一个字符串,打印该字符串中字符的全排序。例如输入ab,打印ab和ba‘;输入abc,打印abc,acb,bac,bca,cab,cba。

方法:将字符存入set中,循环取,每取出一个,求剩下字符的全排列;如果set中只有一个字符,则返回这个字符。

详细代码

public class FullArranged {
    public static List fullArranged(HashSet characterHashSet) {
        List result = new ArrayList<>();

        if (characterHashSet.size() == 1) {
            for (Character character : characterHashSet) {
                result.add(String.valueOf(character));
                return result;
            }
        }

        for (Character character : characterHashSet) {
            HashSet copy = (HashSet)characterHashSet.clone();
            copy.remove(character);
            List sub = fullArranged(copy);
            for (String s : sub) {
                result.add(String.valueOf(character) + s);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        String s = "abcd";
        HashSet characterHashSet = new HashSet<>();
        for (int i = 0; i < s.length(); i++) {
            characterHashSet.add(s.charAt(i));
        }

        System.out.println(JSON.toJSONString(fullArranged(characterHashSet)));
    }
}

该算法的时间复杂度为O(n!),相当于穷举。

以上的代码有一个问题,就是出现重复字符如何处理?

如果出现重复字符,将不能使用set,因为set会过滤重复字符;需要改成用list。按照上面的方式循环list,将结果存放到set中用来过滤重复的字符串。时间复杂度不变。

你可能感兴趣的:(算法)