如何在c ++中获取每个可能的n个字符串?

时间:2017-03-14 20:40:14

标签: c++ string permutation

我知道可以使用n个嵌套for循环来获得结果。然而,这并不是非常灵活。如果我想获得每个字符串的n + 2个字符,我将不得不为循环编写额外的两个字符。

我非常确定我应该使用名为n_Letters的参数并使用某种递归。有任何想法吗?这就是我的代码现在的样子。它提供了所有3种字符组合。

#include <iostream>
#include <string>
using namespace std;

void StringMaker(){
   for(int firstLetter = 97; firstLetter < 123; firstLetter++){
    char a = firstLetter;
    for(int secondLetter = 97; secondLetter < 123; secondLetter++){
        char b = secondLetter;
        for(int thirdLetter = 97; thirdLetter < 123; thirdLetter++){
            char c = thirdLetter;
            cout << a << b << c << endl;
        }
    }
}
}

int main() {
    StringMaker(); // I could add a parameter n_Letters here
}

2 个答案:

答案 0 :(得分:1)

这是一个简单的树遍历问题,可以使用递归轻松解决。使用计数器(count)和累加器(partial)会对每个字母的函数重复出现,直到count为零,然后打印partial

#include <iostream>
#include <string>

void StringMaker(int count, std::string partial = "") {
    if (count == 0) {
        std::cout << partial << '\n';
    }
    else {
        for (char letter = 'a'; letter <= 'z'; ++letter) {
            StringMaker(count - 1, partial + letter);
        }
    }
}

int main() {
    StringMaker(3);
    return 0;
}

编辑:看来他们对我关于内存分配的回答有些担忧。如果您担心,请考虑这种替代解决方案。如果第一个字符不是'z',则递增第一个字符,否则将其设置为a并使用第二个字符重复。这样做直到最后一个字符从z设置为a。这充当了一种具有count位的基础26计数器。

#include <iostream>
#include <string>

void StringMaker(size_t count) 
{
    std::string data(count, 'a');
    size_t i = 0;
    do
    {
        std::cout << data << '\n';

        for (i = 0; i < count; ++i)
        {
            auto & next_char = data[i];
            if (next_char < 'z') {
                ++next_char;
                break;
            }
            else {
                next_char = 'a';
            }
        }

    } while (i != count);
}

int main() {
    StringMaker(3);
    return 0;
}

答案 1 :(得分:1)

这是我唯一有趣的解决方案:

void StringMaker(int n)
{
      int base = ('z' - 'a' + 1);
      std::string str(n, '\0');

      for(int i = 0; i < int_pow(base, n); ++i)
      {
            for(int j = 0; j < n; ++j)
            {
                  str[n - j - 1] = 'a' + i / int_pow(base, j) % base;
            }
            cout << str << '\n';
      }
}

假设我们用基数为26(从a到z)的数值系统写i,所以n = 4的增量i给我们aaaa,aaab等等