剑指 Offer 第38题:字符串的排列

2022-08-05  本文已影响0人  放开那个BUG

1、前言

题目描述

2、思路

这道题就是全排列,全排列分两种,一种是无重复数字,那么其实不用考虑去重问题,直接把所有结果都放进去。

但是还有重复字符的全排列,结果需要去重复,去重的重点是先排序(方便减枝),然后有重复的第二个直接跳过即可:i > 0 && array[i] == array[i - 1] && used[i - 1

3、代码

class Solution {

    private List<String> res = new ArrayList<>();

    public String[] permutation(String s) {
        if(s == null || s.length() == 0){
            return new String[]{};
        }
        char[] array = s.toCharArray();
        Arrays.sort(array);
        boolean[] used = new boolean[s.length()];
        dfs(array, new StringBuilder(), used);

        return res.toArray(new String[]{});
    }

    private void dfs(char[] array, StringBuilder builder, boolean[] used){
        if(builder.length() == array.length){
            res.add(builder.toString());
            return;
        }

        for(int i = 0; i < array.length; i++){
            if(used[i]){
                continue;
            }
            if(i > 0 && array[i] == array[i - 1] && used[i - 1]){
                continue;
            }
            used[i] = true;
            builder.append(array[i]);
            dfs(array, builder, used);
            used[i] = false;
            builder.deleteCharAt(builder.length() - 1);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读