C# 生成允许重复的排列、组合

/// <summary>
/// 获取允许重复的排列组合
/// </summary>
/// <param name="s"> 源字符串</param>
/// <param name="cnt"> 组合位数</param>
/// <returns> 生成结果</returns>
static IEnumerable<string > GetVariations(string s)
{
        int[] indexes = new int[s.Length];
        StringBuilder sb = new StringBuilder ();

        while (IncrementIndexes(indexes, s.Length))
        {
            sb.Clear();
            for ( int i = 0; i < indexes.Length; i++)
            {
                    if (indexes[i] != 0)
                    {
                            sb.Append(s[indexes[i] - 1]);
                    }
            }

            yield return sb.ToString();

        }
}

static bool IncrementIndexes( int[] indexes, int limit)
{
        for ( int i = 0; i < indexes.Length; i++)
        {
            indexes[i]++;
            if (indexes[i] > limit)
            {
                    indexes[i] = 1;
            }
            else
            {
                    return true;
            }
        }
        return false;
}

排列 和 组合的区别

排列是有顺序的,如(a,b,c)和(b,c,a)是不同的,虽然同样是三个字母,但顺序不同。

组合是没有顺序的,如(a,b,c)和(b,c,a)是相同的,只要是同样的字母组合,顺序无所谓。

本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注