生成一个序列所有排列的算法
递归算法比较简单
vector<string> p(string s)
{
vector<string> result;
if(s.size() == 1)
{
result.push_back(s);
return result;
}
for(int i=0;i<s.size();i++)
{
char c=s[i];
string subs=s;
subs.erase(i,1);
vector<string> t=p(subs);
for(int i=0;i<t.size();i++)
result.push_back(t[i].append(1,c));
}
return result;
}
非递归算法就稍微复杂点,可惜面试的时候没有仔细检查这个实现。
vector<string> p(string s)
{
vector<string> result;
int n=s.size();
char *buf=new char[n+1];
buf[n]='\0';
vector<bool> flags(n);
vector<int> index(n);
for(int i=0;i<n;i++)
{
flags[i]=false;
index[i]=-1;
}
int i=0;
while(i >= 0)
{
if(i == n)
{
string tmp(buf);
result.push_back(tmp);
i--;
}
else
{
int j;
for(j=index[i]+1;j<n;j++)
if(flags[j] == false) break;
if(index[i] >= 0)
flags[index[i]] =false;
if(j < n)
{
index[i]=j;
flags[index[i]]=true;
buf[i]=s[j];
i++;
}
else //backtrace to the previous location
{
index[i] = -1;
i--;
}
}
}
delete []buf;
return result;
}
说到底这个算法还是比较简单的,就是回溯的时候需要注意,必须将原来合法的位置重新标志为非法来释放占有的那个元素。