What's a good way for figuring out all possible words of a given length

后端 未结 12 1773
一生所求
一生所求 2021-02-04 17:27

I\'m trying to create an algorithm in C# which produces the following output strings:

AAAA
AAAB
AAAC
...and so on...
ZZZX
ZZZY
ZZZZ

What is the

相关标签:
12条回答
  • 2021-02-04 17:51

    This is an recursive version of the same functions in C#:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace ConsoleApplication1Test
    {
        class Program
        {
            static char[] my_func( char[] my_chars, int level)
            {
                if (level > 1)
                    my_func(my_chars, level - 1);
                my_chars[(my_chars.Length - level)]++;
                if (my_chars[(my_chars.Length - level)] == ('Z' + 1))
                {
                    my_chars[(my_chars.Length - level)] = 'A';
                    return my_chars;
                }
                else
                {
                    Console.Out.WriteLine(my_chars);
                    return my_func(my_chars, level);
                }
            }
            static void Main(string[] args)
            {
                char[] text = { 'A', 'A', 'A', 'A' };
                my_func(text,text.Length);
                Console.ReadKey();
            }
        }
    }
    

    Prints out from AAAA to ZZZZ

    0 讨论(0)
  • 2021-02-04 17:53

    A very simple but awesome code that generates all words of 3 and 4 letters of english language

    #include <iostream>
    using namespace std;
    char alpha[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}
    int main() {
    int num;
    cin >> num;
    if (num == 3) { //all 3 letter words
        for (int i = 0; i <= 25; i++) {
            for (int o = 0; o <= 25; o++) {
                for (int p = 0; p <= 25; p++) {
                    cout << alpha[i] << alpha[o] << alpha[p] << " ";
                }
            }
        }
    }
    else if (num == 4) { //all 4 letter words
        for (int i = 0; i <= 25; i++) {
            for (int o = 0; o <= 25; o++) {
                for (int p = 0; p <= 25; p++) {
                    for (int q = 0; q <= 25; q++) {
                        cout << alpha[i] << alpha[o] << alpha[p] << alpha[q] << " ";
                    }
                }
            }
        }
    }
    else {
        cout << "Not more than 4"; //it will take more than 2 hours for generating all 5 letter words
      }
    }
    
    0 讨论(0)
  • 2021-02-04 17:57

    well, if the length is a constant 4, then this would handle it:

    public static IEnumerable<String> GetWords()
    {
        for (Char c1 = 'A'; c1 <= 'Z'; c1++)
        {
            for (Char c2 = 'A'; c2 <= 'Z'; c2++)
            {
                for (Char c3 = 'A'; c3 <= 'Z'; c3++)
                {
                    for (Char c4 = 'A'; c4 <= 'Z'; c4++)
                    {
                        yield return "" + c1 + c2 + c3 + c4;
                    }
                }
            }
        }
    }
    

    if the length is a parameter, this recursive solution would handle it:

    public static IEnumerable<String> GetWords(Int32 length)
    {
        if (length <= 0)
            yield break;
    
        for (Char c = 'A'; c <= 'Z'; c++)
        {
            if (length > 1)
            {
                foreach (String restWord in GetWords(length - 1))
                    yield return c + restWord;
            }
            else
                yield return "" + c;
        }
    }
    
    0 讨论(0)
  • 2021-02-04 17:57

    Simpler Python!

    def getWords(length=3):
        if length == 0: raise StopIteration
        for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
            if length == 1: yield letter
            else:
                for partialWord in getWords(length-1):
                    yield letter+partialWord
    
    0 讨论(0)
  • 2021-02-04 18:01

    Haskell!

    replicateM 4 ['A'..'Z']
    

    Ruby!

    ('A'*4..'Z'*4).to_a
    
    0 讨论(0)
  • 2021-02-04 18:03

    There's always the obligatory LINQ implementation. Most likely rubbish performance, but since when did performance get in the way of using cool new features?

    var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
    
    var sequence = from one in letters
                   from two in letters
                   from three in letters
                   from four in letters
                   orderby one, two, three, four
                   select new string(new[] { one, two, three, four });
    

    'sequence' will now be an IQueryable that contains AAAA to ZZZZ.

    Edit:

    Ok, so it was bugging me that it should be possible to make a sequence of configurable length with a configurable alphabet using LINQ. So here it is. Again, completely pointless but it was bugging me.

    public void Nonsense()
    {
        var letters = new[]{"A","B","C","D","E","F",
                            "G","H","I","J","K","L",
                            "M","N","O","P","Q","R","S",
                            "T","U","V","W","X","Y","Z"};
    
        foreach (var val in Sequence(letters, 4))
            Console.WriteLine(val);
    }
    
    private IQueryable<string> Sequence(string[] alphabet, int size)
    {
        // create the first level
        var sequence = alphabet.AsQueryable();
    
        // add each subsequent level
        for (var i = 1; i < size; i++)
            sequence = AddLevel(sequence, alphabet);
    
        return from value in sequence
               orderby value
               select value;
    }
    
    private IQueryable<string> AddLevel(IQueryable<string> current, string[] characters)
    {
        return from one in current
               from character in characters
               select one + character;
    }
    

    The call to the Sequence method produces the same AAAA to ZZZZ list as before but now you can change the dictionary used and how long the produced words will be.

    0 讨论(0)
提交回复
热议问题