字符串全排序

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

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

详细代码

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

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

        for (Character character : characterHashSet) {
            HashSet<Character> copy = (HashSet<Character>)characterHashSet.clone();
            copy.remove(character);
            List<String> 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<Character> 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中用来过滤重复的字符串。时间复杂度不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值