How to generate all variations with repetitions of a string?

前端 未结 3 431
南方客
南方客 2020-12-16 06:04

I want to generate all variations with repetitions of a string in C++ and I\'d highly prefer a non-recursive algorithm. I\'ve come up with a recursive algorithm in the past

3条回答
  •  隐瞒了意图╮
    2020-12-16 06:26

    You could think of it as counting, in a radix equal to the number of characters in the alphabet (taking special care of multiple equal characters in the alphabet if that's a possible input). The aaaa aaab aaba ... example for instance, is actually the binary representation of the numbers 0-15.

    Just do a search on radix transformations, implement a mapping from each "digit" to corresponding character, and then simply do a for loop from 0 to word_lengthalphabet_size

    Such algorithm should run in time linearly proportional to the number of strings that needs to be produced using constant amount of memory.

    Demonstration in Java

    public class Test {
        public static void main(String... args) {
    
            // Limit imposed by Integer.toString(int i, int radix) which is used
            // for the purpose of this demo.
            final String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
    
            int wordLength = 3;
            char[] alphabet = { 'a', 'b', 'c' };
    
            for (int i = 0; i < Math.pow(wordLength, alphabet.length); i++) {
    
                String str = Integer.toString(i, alphabet.length);
    
                String result = "";
                while (result.length() + str.length() < wordLength)
                    result += alphabet[0];
    
                for (char c : str.toCharArray())
                    result += alphabet[chars.indexOf(c)];
    
                System.out.println(result);
            }
        }
    }
    

    output:

    aaa
    aab
    aac
    aba
    abb
    abc
    aca
    acb
    acc
    baa
    bab
    bac
    bba
    bbb
    bbc
    bca
    bcb
    bcc
    caa
    cab
    cac
    cba
    cbb
    cbc
    cca
    ccb
    ccc
    

提交回复
热议问题