找到一定范围内所有可能的排列

本文关键字:有可能 排列 范围内 | 更新日期: 2023-09-27 18:15:36

我想做一个程序,从雅虎财经找到所有有效的股票符号,我已经找到了这个:最快的方法来枚举字母表但是,我不想从A - Z开始然后AA - AZ然后ABA - ABZ,以此类推。最好的方法是什么?更清楚的例子:A B C D等。AA AB AC AD等。ABA ABB ABC ABD等

找到一定范围内所有可能的排列

使用Eric Lippert的笛卡尔积,

var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int maxlen = 3;
var query = Enumerable.Range(1, maxlen)
            .SelectMany(i => Enumerable.Repeat(chars, i)
                             .CartesianProduct()
                             .Select(x => String.Concat(x)));

foreach(var str in query)
{
    Console.WriteLine(str);
}

<我>PS:只是为了完整:

public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    // base case:
    IEnumerable<IEnumerable<T>> result = new[] { Enumerable.Empty<T>() };
    foreach (var sequence in sequences)
    {
        var s = sequence; // don't close over the loop variable
                            // recursive case: use SelectMany to build the new product out of the old one
        result =
            from seq in result
            from item in s
            select seq.Concat(new[] { item });
    }
    return result;
}

不确定它有多快,但是当我需要做类似的事情时,我做了以下操作:

        for (int i = 0; i < numCols && i < 26; i++)
        {
            char start = 'A';
            char colChar = (char)(start + (char)(i));
            Console.WriteLine(string.Format("{0}", colChar), typeof(string));
        }
        for (int i = 26; i < 52 && i < numCols; i++)
        {
            char start = 'A';
            char colChar = (char)(start + (char)(i-26));
            Console.WriteLine(string.Format("A{0}", colChar), typeof(string));
        }

第二个for循环显然只通过AZ返回AA,但是如果你把它放在一个函数中,让第一个a作为输入,那么你可以通过a - z循环第一个字符,你就得到了所有两个字符的结果。创建第三个函数,输入2个字符作为前面的字符串,将得到三个字符集。

26*26*26是大量的输出,但上面的模式应该为您提供。