我被要求编写一个使用递归的置换函数。函数的唯一参数应该是我应该找到所有排列的字符串。该函数应返回包含所有可能排列的向量。我知道我可以在STL算法中使用next_permutation
,但我被要求不要。
我已经设置了基础案例,我知道我需要一个for循环,但我不太确定从那里开始。有人能指出我正确的方向吗?
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
}
}
}
任何帮助都将不胜感激。
答案 0 :(得分:4)
想象一下,你已经拥有了函数上一次迭代的结果,并返回了字符串前n-1个元素的所有排列。
vector<string>& v_prev = getPerm(str.substr(0, str.length()-1));
在
中使用此功能//Some code
您的部分代码。
另一个提示:使用0长度字符串作为递归的停止条件。你可以递归地构造1-lenght排列;)
以下是整个解决方案:
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;
}
}
答案 1 :(得分:1)
考虑字符串“123”
的这些排列123
132
213
231
312
321
考虑一下“12”的这些排列
12
21
如果您知道所有n
个字母子串的排列,您能看到如何构造n-1
字母字符串的排列。这种解决方案是递归的。
答案 2 :(得分:1)
x
中的每个元素yourArray
yourArray
的{{1}}副本。调用此新数组x
。newArray
newArray
添加到每个排列的开头答案 3 :(得分:1)
实施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]);
}
}
}
}
答案 4 :(得分:0)
尝试这样的事情:
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;