C++ 编写置换函数
我被要求编写一个使用递归的置换函数。函数的唯一参数应该是字符串,我应该找到它的所有排列。函数应该返回一个包含所有可能排列的向量。我知道我可以在STL算法中使用next_排列,但我被要求不要这样做 我已经建立了基本情况,我知道我需要一个for循环,但我不太确定从那里开始。有人能给我指出正确的方向吗C++ 编写置换函数,c++,vector,permutation,C++,Vector,Permutation,我被要求编写一个使用递归的置换函数。函数的唯一参数应该是字符串,我应该找到它的所有排列。函数应该返回一个包含所有可能排列的向量。我知道我可以在STL算法中使用next_排列,但我被要求不要这样做 我已经建立了基本情况,我知道我需要一个for循环,但我不太确定从那里开始。有人能给我指出正确的方向吗 vector <string> getPerm(string str) { vector<string> v; if(w.length() <= 1)
vector <string> getPerm(string str)
{
vector<string> v;
if(w.length() <= 1)
{
v.push_back(str);
return v;
}
else
{
for(int i = 0; i < str.size(); i++)
{
//Some code
}
}
}
任何帮助都将不胜感激。考虑一下字符串123的这些排列
123
132
213
231
312
321
想想这些12的排列
12
21
如果你知道所有n-1个字母的子串的排列,你能看到如何构造一个n个字母串的排列吗。这种类型的解决方案是递归的。考虑一下字符串123的这些排列
123
132
213
231
312
321
想想这些12的排列
12
21
如果你知道所有n-1个字母的子串的排列,你能看到如何构造一个n个字母串的排列吗。这种类型的解决方案是递归的
对于数组中的每个元素x
制作不带元素x的数组副本。将此新数组称为newArray。
查找newArray的所有置换
将元素x添加到每个排列的开头
对于数组中的每个元素x
制作不带元素x的数组副本。将此新数组称为newArray。
查找newArray的所有置换
将元素x添加到每个排列的开头
试着这样做:
permut(s) :
if s.length=0 : exit;
else :
for i=0 to s.length :
front:=s[i];
remove(s,i);
s2 := front + permut(s);
print s2, NEWLINE;
试着这样做:
permut(s) :
if s.length=0 : exit;
else :
for i=0 to s.length :
front:=s[i];
remove(s,i);
s2 := front + permut(s);
print s2, NEWLINE;
实现Ken Bloom刚刚写的内容:
vector <string> getPerm(string str)
{
vector<string> v;
if(str.length() <= 1)
{
v.push_back(str);
return v;
}
else
{
for(int i = 0; i < str.size(); i++){
vector<string> perms = getPerm(str.substr(0,i)+str.substr(i+1));
for(int j = 0; j < perms.size(); j++){
v.push_back(str[i] + perms[j]);
}
}
}
}
实现Ken Bloom刚刚写的内容:
vector <string> getPerm(string str)
{
vector<string> v;
if(str.length() <= 1)
{
v.push_back(str);
return v;
}
else
{
for(int i = 0; i < str.size(); i++){
vector<string> perms = getPerm(str.substr(0,i)+str.substr(i+1));
for(int j = 0; j < perms.size(); j++){
v.push_back(str[i] + perms[j]);
}
}
}
}
假设您已经得到函数上一次迭代的结果,返回字符串前n-1个元素的所有排列
vector<string>& v_prev = getPerm(str.substr(0, str.length()-1));
代码的一部分
另一个技巧:使用长度为0的字符串作为递归的停止条件。可以递归地构造1-长度排列
以下是整个解决方案:
vector<string> getPerm(string str)
{
vector<string> v;
if (str.empty())
{
v.push_back(string());
return v;
}
else
{
vector<string>& v_prev = getPerm(str.substr(0, str.length()-1));
for(int i = 0; i < v_prev.size(); i++)
{
for (int j = 0; j < v_prev[i].length() + 1; j++)
{
string p = v_prev[i];
p.insert(j, str.substr(str.length() - 1, 1));
v.push_back(p);
}
}
return v;
}
}
假设您已经得到函数上一次迭代的结果,返回字符串前n-1个元素的所有排列
vector<string>& v_prev = getPerm(str.substr(0, str.length()-1));
代码的一部分
另一个技巧:使用长度为0的字符串作为递归的停止条件。可以递归地构造1-长度排列
以下是整个解决方案:
vector<string> getPerm(string str)
{
vector<string> v;
if (str.empty())
{
v.push_back(string());
return v;
}
else
{
vector<string>& v_prev = getPerm(str.substr(0, str.length()-1));
for(int i = 0; i < v_prev.size(); i++)
{
for (int j = 0; j < v_prev[i].length() + 1; j++)
{
string p = v_prev[i];
p.insert(j, str.substr(str.length() - 1, 1));
v.push_back(p);
}
}
return v;
}
}
这里有一个用于创建连续排列的方法,它可能会给您start@Collin我想这正是我需要的!如果你在写一个使用递归的算法,你真的不想看Collin的算法,也不想看下一个置换,因为它们都不是递归的。Helpfull链接:@RondogiannisAristophanes这不是重复的,因为那个版本不是递归的,而这个版本是。下面是一个用于创建连续置换的,这可能会给你带来麻烦start@Collin我想这正是我需要的!如果你正在写一个使用递归的算法,你真的不想看Collin的算法,也不想看下一个置换,因为它们都不是递归的。Helpfull链接:@RondogiannisAristophanes这不是重复的,因为那个版本不是递归的,而这个版本是。复制粘贴修复的问题复制粘贴修复的问题