让我们说,我们有字符串“ABCAD”,现在我们需要在顺时针和逆时针方向上迭代这个字符串的所有可能排列。
我丑陋的实现看起来像这样:
string s = "ABCAD";
string t ="";
for(int i = 0; i < sz(s); i++){
t = s[i];
for(int j = i+1; ; j++){
if((j) == sz(s)){
j = 0;
}
if(j == i){
break;
}
t+= s[j];
}
cout<<t<<" ";
}
reverse(all(s));
for(int i = 0; i < sz(s); i++){
t = s[i];
for(int j = i+1; ; j++){
if((j) == sz(s)){
j = 0;
}
if(j == i){
break;
}
t+= s[j];
}
cout<<t<<" ";
}
输出:
AHSAU HSAUA SAUAH AUAHS UAHSA UASHA ASHAU SHAUA HAUAS AUASH
我知道太天真了,AFAIK循环列表会是更好的选择,有人可以使用STL更有效地实现同样的事情吗?
答案 0 :(得分:4)
在伪代码中,我会走这条路:
function rearrange (string s) {
string t = s + s;
for (int i = 0; i < length(s); ++i)
print t.substring(i, length(s));
}
input = "ABCAD"
rearrange(input);
rearrange(reverse(input));
可能有一种方法可以使用仿函数重写rearrange(),但是我的STL-fu生锈了。
答案 1 :(得分:2)
最佳解决方案不是数据结构,而是算法 - 请参阅next_permutation
答案 2 :(得分:2)
我相信你要找的是rotate算法。对于反向的,您需要像在自己的代码中那样反向。
未经测试的代码可以执行您的操作:
std::string s = "ABCAD"
for (int i = 0; i < s.size(); ++i)
{
std::cout << s << std::endl;
std::rotate(s.begin(), s.begin() + 1, s.end());
}
reverse(s.begin(), s.end());
// same loop as above for reverse "arrangements"