c# – 计算字符串的所有可能组合,并加以扭曲

我试图允许用户在文本框中输入文本,并让程序生成所有可能的组合,除了最少3个字符,最多6个字符.我不需要像’as’这样无用的单词, ‘a’,’i’,’to’等混乱我的阵列.我还将根据字典检查每个组合,以确保它是一个真正的单词.

我有完整的字典(精心制作,here’s a link to it作为回报(警告:巨大的加载时间(对我而言)!)

无论如何,如果用户输入’ABCDEF'(没有特定的顺序),我怎么能生成,例如:

'ABC'
'BAC'
'CAB'
...
'ABD'
'ABE'
'ABF'

等……无论什么顺序,每种可能的组合?我知道这些组合有一些荒谬的组合,但它只需要计算一次,所以我不太担心.

我发现代码示例以递归方式找到固定宽度字符串(ABCDEF,ABCDFE … ACDBFE等)的组合(不是排列,我不需要那些).他们没有做我需要的事情,而且我对这个项目的起点也没有丝毫的线索.

这不是作业,它开始是我的个人项目,它已经成长为一个简单的问题……我无法相信我无法理解这一点!

最佳答案 听起来像你在描述
Power Set

这是我在个人图书馆里面的一个实现:

// Helper method to count set bits in an integer
public static int CountBits(int n)
{
    int count = 0;
    while (n != 0)
    {
        count++;
        n &= (n - 1);
    }
    return count;
}


public static IEnumerable<IEnumerable<T>> PowerSet<T>(
    IEnumerable<T> src, 
    int minSetSize = 0, 
    int maxSetSize = int.MaxValue)
{
    // we want fast random access to the source, so we'll
    // need to ToArray() it
    var cached = src.ToArray();
    var setSize = Math.Pow(2, cached.Length);
    for(int i=0; i < setSize; i++)
    {
        var subSetSize = CountBits(i);
        if(subSetSize < minSetSize || 
           subSetSize > maxSetSize)
        {
            continue;
        }
        T[] set = new T[subSetSize];

        var temp = i;
        var srcIdx = 0;
        var dstIdx = 0;
        while(temp > 0)
        {
            if((temp & 0x01) == 1)
            {
                set[dstIdx++] = cached[srcIdx];
            }
            temp >>= 1;
            srcIdx++;            
        }
        yield return set;
    }
    yield break;
}

还有一个快速测试台:

void Main()
{
    var src = "ABCDEF";
    var combos = PowerSet(src, 3, 6);

    // hairy joins for great prettiness
    Console.WriteLine(
        string.Join(" , ", 
            combos.Select(subset => 
                string.Concat("[", 
                    string.Join(",", subset) , "]")))
    );
}

输出:

[A,B,C] , [A,B,D] , [A,C,D] , [B,C,D] , [A,B,C,D] , [A,B,E] , [A,C,E] , [B,C,E] , [A,B,C,E] , 
[A,D,E] , [B,D,E] , [A,B,D,E] , [C,D,E] , [A,C,D,E] , [B,C,D,E] , [A,B,C,D,E] , [A,B,F] , 
[A,C,F] , [B,C,F] , [A,B,C,F] , [A,D,F] , [B,D,F] , [A,B,D,F] , [C,D,F] , [A,C,D,F] , 
[B,C,D,F] , [A,B,C,D,F] , [A,E,F] , [B,E,F] , [A,B,E,F] , [C,E,F] , [A,C,E,F] , [B,C,E,F] , 
[A,B,C,E,F] , [D,E,F] , [A,D,E,F] , [B,D,E,F] , [A,B,D,E,F] , [C,D,E,F] , [A,C,D,E,F] , 
[B,C,D,E,F] , [A,B,C,D,E,F]
点赞