字符串的排列

本文详细介绍了如何使用递归实现一个字符串中所有字符的全排列,代码以Java为例,通过交换字符并回溯的方式生成所有可能的排列组合。算法的时间复杂度和空间复杂度均为O(n!),适用于长度小于10的字符串。文章还强调了在排列过程中避免字符重复的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。

例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

数据范围:n < 10n<10
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)

输入描述:

输入一个字符串,长度不超过10,字符只包括大小写字母。

 二、思路

①先确定以那个字符开头

②剩下的都是子问题

注意!!!

要让每个字符都做一遍开头,然后后面的字符不能是前面出现过的!

三、代码实现:

import java.util.*;
public class Solution {
    public void Swap(char[] str,int start,int end){ //不会出现字符重复的情况
        char tmp = str[start];
        str[start] = str[end];
        str[end] = tmp;
    }
    public boolean IsExist(ArrayList<String> ret,char[] str){
        return ret.contains(String.valueOf(str));
    }
    public void PermutationHelper(char[] str,int start,ArrayList<String> ret){
        if(start == str.length-1){//说明起始位置是最后一个一个字符了
            //应该是叶子结点了,不需要再排列了
           if(!IsExist(ret,str)){
               ret.add(new String(str));
           }
            return;//结束这个函数
        }
        //start永远代表的是第一个元素
        for( int i = start;i < str.length;i++){
            Swap(str,start,i);
            PermutationHelper(str,start+1,ret);//i开头的可能性全部保存到了ret中
            Swap(str,start,i);//恢复回来 abc
        }
    }
    public ArrayList<String> Permutation(String str) {
        //创建结果集容器
       ArrayList<String>  ret = new ArrayList<>();
        if(str != null && str.length() > 0){
            // 0 当前字符串的零下标元素
            PermutationHelper(str.toCharArray(),0,ret);
            //直接应用底层函数翻转
            Collections.sort(ret);
        }
        return ret;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值