📌  相关文章
📜  C#程序打印给定字符串的所有排列(1)

📅  最后修改于: 2023-12-03 14:39:49.035000             🧑  作者: Mango

C#程序打印给定字符串的所有排列

在这个项目中,我们将通过C#代码实现打印给定字符串的所有排列。

什么是字符串的排列?

字符串的排列指的是将字符串的所有字符重新排列以形成新的字符串,这个新的字符串可能与原字符串不同,但它们的字符都相同。 例如,字符串 "abc" 的排列为 "abc"、“acb”、“bac”、“bca”、“cab”、“cba”。

实现方法

我们将采用递归的方法来实现打印给定字符串的所有排列。具体步骤如下:

  1. 将给定字符串转换为字符数组。
  2. 遍历字符数组,把每个字符依次替换到第一个位置上,然后递归处理后面的字符。
  3. 在递归处理完之后,还需要将第一个位置上的字符还原回去,然后继续遍历后面的字符。
  4. 当遍历完所有字符时,将当前的排列加入到结果集中。

下面是代码实现:

using System;
using System.Collections.Generic;

public class StringPermutation
{
    private List<string> results = new List<string>();

    public List<string> Permute(string s)
    {
        if (string.IsNullOrEmpty(s))
        {
            return results;
        }

        Permute(s.ToCharArray(), 0);

        return results;
    }

    private void Permute(char[] chars, int start)
    {
        if (start == chars.Length - 1)
        {
            results.Add(new string(chars));
            return;
        }

        for (var i = start; i < chars.Length; i++)
        {
            Swap(chars, start, i);
            Permute(chars, start + 1);
            Swap(chars, start, i);
        }
    }

    private void Swap(char[] chars, int i, int j)
    {
        var temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
}
实现说明
  1. 我们在类中定义一个 List<string> 类型的变量 results,用于存储结果。
  2. 我们定义了一个 Permute(string s) 方法,它接收一个字符串作为参数,并返回字符串的所有排列。
  3. Permute(string s) 方法中,我们首先将输入的字符串转换为字符数组,然后调用 Permute(char[] chars, int start) 方法进行递归处理。
  4. Permute(char[] chars, int start) 方法接收两个参数 charsstartchars 表示当前要处理的字符数组,start 表示已经处理好的字符数量。在递归处理时,我们通过交换位置来对原字符串进行重新排列。
  5. start 等于字符数组的长度减一时,即处理完毕,将当前排列加入结果集合中,并返回上一个递归调用。
  6. 在交换两个字符位置的时候,我们定义了一个 Swap(char[] chars, int i, int j) 方法,其作用是实现交换。
使用示例
var permute = new StringPermutation();
var result = permute.Permute("abc");

foreach (var item in result)
{
    Console.WriteLine(item);
}

输出结果为:

abc
acb
bac
bca
cba
cab