剑指 Offer 38. 字符串的排列-全排列-回溯

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 38. 字符串的排列-全排列-回溯相关的知识,希望对你有一定的参考价值。

一、题目描述

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例 1:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]

二、解题

回溯

全排列问题,使用回溯。

class Solution 
    public String[] permutation(String s) 
        //升序
        char[] schar = s.toCharArray();
        Arrays.sort(schar);
        List<String> res = new ArrayList<>(); 
        StringBuffer per = new StringBuffer();
        boolean[] visited = new boolean[schar.length];
        dfs(res,per,schar,visited,0);
        String[] ans = new String[res.size()];
        for(int i = 0;i<res.size();i++)
            ans[i] = res.get(i);
        
        return ans;
    

    public void dfs(List<String> res,StringBuffer per,char[] schar,boolean[] visited,int index)
        //终止条件
        if(index == schar.length)
            res.add(per.toString());
            return;
        
        for(int i = 0;i<schar.length;i++)
            //去重
            if(visited[i] || (i > 0 && schar[i] == schar[i-1] && visited[i-1] == false ))
                continue;
            
            visited[i] = true;
            per.append(schar[i]);
            dfs(res,per,schar,visited,index+1);
            per.deleteCharAt(per.length()-1);
            visited[i] = false;
        
    

时间复杂度:O(n×n!);

空间复杂度:O(n)。

以上是关于剑指 Offer 38. 字符串的排列-全排列-回溯的主要内容,如果未能解决你的问题,请参考以下文章

[Mdfs] lc剑指 Offer 38. 字符串的排列(全排列+枚举顺序+组合类型枚举+知识理解+模板题)

剑指 Offer 38. 字符串的排列(dfs回溯实现全排列,Java)

[剑指Offer]38-字符串的全排列

剑指 Offer 38. 字符串的排列

剑指 Offer 38. 字符串的排列

剑指offer-28.全排列