我想知道在CPP中是否已经有一个实现,可以找到长度为k(1,2,3,4等)的n个字符的所有重复排列。我希望有,但我找不到。
例如,如果string=(A, B, C, D)
并且我想找到string
的所有排列,重复长度为k=2
。
输出将类似于:
AA
AB
AC
AD
.
.
.
DD
总排列为16。
这不是一个排列,这可能解释了为什么你找不到答案。
你实际上问的是如何打印数字< code>0..k-1,使用数字< code>A、B、C、D。我将用熟悉的数字< code>0,1,2,3重写您的示例:
00
01
02
03
10
11
12
13
..
33
没有标准的C方法,但是现在你知道它的名字了,网上有很多代码。或者自己写。提示:i
的最后一个数字具有值i%n
。
你可以使用 std::next_permutation()
作为 πάντα ῥεῖ 说, 但是既然你想用重复来定义长度和字符, 你可以做一些容易实现它的事情, 如:
std::string s = "aabbccdd";
std::set<std::string> string_set;
std::sort(s.begin(), s.end());
do {
string_set.insert(s.substr(0, 2));
} while(std::next_permutation(s.begin(), s.end()));
for(auto i = string_set.begin(); i != string_set.end(); ++i)
std::cout << *i << std::endl;
简单的递归解决方案,肯定会对您有效。
让我首先重写您的规范:打印所有具有重复字符的排列
给定一个长度为n的字符串,打印给定字符串的所有排列。允许重复字符
对于给定的长度为n的字符串,将有长度为“length”的n^k可能字符串。这个想法是从一个空的输出字符串开始(在下面的代码中我们称之为前缀)。将所有字符逐个添加到前缀中。对于每个添加的字符,通过递归调用“length”等于“length”-1,打印所有可能的带有当前前缀的字符串。
#include <string>
#include <iostream>
void print_str(const char*,std::string,const int, const int);
int main()
{
int lenght = 2;
char str[] = {'A', 'B', 'C', 'D'};
int n = sizeof str;
print_str(str, "", n, lenght); //Note: this function works on all cases and not just the case above
return 0;
}
// The main recursive method to print all possible strings of length "length"
void print_str(const char str[],std::string prefix,const int n, const int lenght)
{
if (lenght == 1)
{
for (int j = 0; j < n; j++)
std::cout << prefix + str[j] << std::endl;
}//Base case: lenght = 1, print the string "lenght" times + the remaining letter
else
{
// One by one add all characters from "str" and recursively call for "lenght" equals to "lenght"-1
for (int i = 0; i < n; i++)
// Next character of input added
print_str(str, prefix + str[i], n, lenght - 1);
// "lenght" is decreased, because we have added a new character
}
}
下面是上面代码的执行:
引用:
http://www.geeksforgeeks.org/print-all-permutations-with-repetition-of-characters/
http://www.geeksforgeeks.org/print-all-combinations-of-given-length/
更新:此更新是根据以下规范编写的。
我需要更多的帮助!!因为我是CPP编程新手。假设长度=3,我如何将从长度=1到长度=3的所有排列组合在一个数组中。表示将长度为1、长度为2和长度为3的所有排列存储在一个数组中
#include <string>
#include <iostream>
#include <vector>
void print_str(const char*,std::string,const int, const int);
std::vector<std::string> permutations ; // the vector permutations which will hold all the permutations,
//if you want you can use it for later use or you can use the array below which is nothing than a copy of this vector.
int NumberOfPermutations = 0; // this variable holds the number of permutations
int main()
{
int lenght = 3;
char str[] = {'A', 'B', 'C', 'D'};
int n = sizeof str;
//here we loop through all the possible lenghts 1, 2 and 3
for (int k = 1; k <= lenght; k++)
{
print_str(str, "", n, k); //Note: this function works on all cases and not just the case above
}
std::string* permut_array = new std::string[NumberOfPermutations]; // the array that we will use to store the permutations in
std::copy(permutations.begin(), permutations.end(), permut_array); // here we copy the vector into the array
//if you want you can use your array to print the permutation as folow
for (int k = 0; k < NumberOfPermutations; k++)
{
std::cout << permut_array[k] << std::endl;
}
return 0;
}
// The main recursive method to print all possible strings of length "length"
void print_str(const char str[],std::string prefix,const int n, const int lenght)
{
if (lenght == 1)
{
for (int j = 0; j < n; j++)
{
// i commented this ligne so that if you want to use your array to print your permutations you will not get a screnn with permutations printed 2 times
//std::cout << prefix + str[j] << std::endl;
permutations.push_back(prefix + str[j]); // the vector that we will use to store the permutations in
}
}//Base case: lenght = 1, print the string "lenght" times + the remaining letter
else
{
// One by one add all characters from "str" and recursively call for "lenght" equals to "lenght"-1
for (int i = 0; i < n; i++)
// Next character of input added
print_str(str, prefix + str[i], n, lenght - 1);
// "lenght" is decreased, because we have added a new character
}
NumberOfPermutations = permutations.size();
}
打印由n个字符组成的长度为k的所有可能的字符串是一个常见的问题,并且已经有了解决方案。 不过,我希望知道 null 输出: 对于复杂度要求:它不应大于。
我必须制作一个Java程序,在给定的字符串中找到长度为n的所有重复子字符串。输入是字符串非常长,暴力方法需要花费太多时间。 我一直在尝试: 目前我正在分别查找每个子字符串,并使用KMP alogrithm检查该子字符串的重复。这也花了太多时间。 解决这个问题的更有效方法是什么?
我必须制作一个Java程序,在给定字符串中找到长度为n的所有重复子字符串。输入是字符串是非常长的,一个暴力的方法需要太多的时间。 我已经尝试了: 现在,我将分别查找每个子字符串,并使用KMP alogrithm检查该子字符串的重复。这也太花时间了。 解决这个问题的更有效的方法是什么?
如何设置textview中的所有行具有相同的字符长度? 这是sqlite数据库中的文本 这是Android的文本视图 我在main.class中的查询代码 db.open();光标c=db.getdescIntro(系,学位); 我的数据库.class 公共游标获取简介(字符串dep,字符串度){ 返回db.query("学术", new String[]{"desc","部门","acapdf"
我写了这个字符串的所有排列的解法。我有一个关于这个解决方案的时间和空间复杂性的问题。我假设时间复杂度将是O(n),因为嵌套循环和递归,而空间复杂度将是O(n)因为递归。 我的假设正确吗?如果有,有没有更好的性能解决方案? https://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-giving-str
给出了一个长度为n的数组。求子数组元素的乘积之和。 解释 长度为3的数组A=[2,3,4]。 因为,对于以模1000000007计算的较长的子数组,乘积可以更大。 对于所有可能长度的子数组,即1,2,3,....,n,求这些和的有效方法是什么,其中n是数组的长度。