输出一个字符串所有排列。注意有重复字符

本文介绍了一个使用C#实现的递归方法来生成字符串的所有可能排列,并通过去除重复项提高效率。该方法适用于需要字符串组合但又希望避免内存中出现大量冗余数据的情况。

C# code as below:

 

  递归写的,因为产生了老多string,效率很慢,除去了重复的字符串
   public static List<string> OutPutString(string str)

        {

            List<string> list = new List<string>();

            if (str.Length == 1)

            {

                list.Add(str);

                return list;

            }

            char[] myCharArray = str.ToCharArray();

            for (int i = 0; i < str.Length; i++)

            {

                string str1 = myCharArray[i].ToString();

                //Use OutPutString(), remove myCharArray[i] from string 

                foreach (string str2 in OutPutString(str.Remove(i,1)))

                {

                    //Remove duplicated string

                    if (!list.Contains(str1 + str2))

                    {

                        list.Add(str1 + str2);

                    }

                }

            }

            return list;

        }

 

### 实现字符串排列算法 对于字符串的全排列问题,可以采用递归的方式解决。当处理较短的字符串,这种方法效率较高且易于理解。下面是一个基于C#语言的具体实现方案[^1]。 #### 使用C#编写全排列函数 定义名为`PermuteString`的方法来接收两个参数:一个是待处理的字符串`s`;另一个是指向当前正在构建的新排列起始位置的索引`startIdx`。每当完成一次完整的字符重排后,就将新形成的字符串加入最终的结果集合中。为了防止重复计算已经访问过的元素,在交换字符之前先检查是否越界以及是否存在相同字符的情况。 ```csharp using System; using System.Collections.Generic; public class StringPermutation { public static List<string> Permutations(string s) { var result = new List<string>(); if (string.IsNullOrEmpty(s)) return result; char[] chars = s.ToCharArray(); Generate(0, chars, ref result); return result; } private static void Generate(int startIdx, char[] array, ref List<string> list){ if(startIdx >= array.Length - 1){ string str = new string(array); if(!list.Contains(str)){ list.Add(new string(array)); } return ; }else{ for(int i=startIdx;i<array.Length;++i){ Swap(ref array[startIdx],ref array[i]); Generate(startIdx+1,array,ref list); Swap(ref array[startIdx],ref array[i]); // backtrack } } } private static void Swap<T>(ref T a, ref T b){ T temp=a;a=b;b=temp; } } ``` 此代码片段实现了对输入字符串的所有不同排列形式进行枚举的功能,并将其存储在一个列表里以便后续操作或展示给用户查看[^4]。 #### 关于性能考量 值得注意的是,由于涉及到大量的分支结构和回溯过程,因此该算法的间复杂度为O(n!),其中n代表原始字符串中的字符数量。这意味着随着输入规模的增长,执行所需间和资源也会呈指数级增加。不过考虑到题目限定条件(即字符串长度小于等于9),这样的解决方案仍然是可行并有效的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值