牛客网刷题-字符串的排列

问题描述

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

输入描述:
输入一个字符串

输出描述:
输出字符串的所有排列

示例

示例1

输入
abc

输出
abc,acb,bac,bca,cab,cb

解决思路

分析

  1. 采用深度优先搜索遍历的方式,采用先固定某个元素,交换其他元素的方式。

方法

  1. 采用深度优先搜索遍历的方式,采用先固定某个元素,交换其他元素的方式。(后期会补图)

递归分析
递归参数:arr 字节数组,list 结果, i 下标
终止条件:终止条件:当i达到了字符数组的长度,添加结果
递归内容:
1、循环交换
1.1 判断字符是否相同,相同不交换
1.2 固定字符
1.3 开启下一层的递归
1.4 交换字符(回溯)

代码实现

// 思路1
public class Solution {
    
      
    
    public ArrayList<String> Permutation(String str) {
    
    
        ArrayList<String> result = new ArrayList<>();
        if (str == null || "".equals(str) || str.length() == 0) {
    
    
            return result;
        }

        getStr(str.toCharArray(), result, 0);
        Collections.sort(result);
        return result;
    }

    private void getStr (char[] arr, ArrayList<String> result, int i) {
    
    
        if (i == arr.length - 1) {
    
    
            result.add(new String(arr));
        }

        for (int j = i; j < arr.length; j++) {
    
    
            // 如果下标不同并且字符相同,则跳过
            if (i != j && arr[i] == arr[j]) {
    
    
                continue;
            } else {
    
    
                // 交换
                swap(arr, i, j);
                // 递归
                getStr(arr, result, i + 1);
                // 回溯
                swap(arr, i, j);
            }
        }
    }

    private void swap (char[] arr, int i, int j) {
    
    
        char temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

时间复杂度分析:
O(N!) : N 为字符串 s 的长度;时间复杂度和字符串排列的方案数成线性关系,方案数为 N×(N−1)×(N−2)…×2×1 ,因此复杂度为 O(N!),即全排列的个数 。

空间复杂度分析:
全排列的递归深度为 N ,系统累计使用栈空间大小为 O(N);使用了额外的arr字符数组,空间大小为字符串 s 的长度 N,所以空间复杂度为O(N)

小伙伴如果想测试的话,可以直接到牛客网这个链接做测试

字符串的排列-牛客网

猜你喜欢

转载自blog.csdn.net/qq_35398517/article/details/113616976