生成一个序列所有排列的算法

递归算法比较简单

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;
}
说到底这个算法还是比较简单的,就是回溯的时候需要注意,必须将原来合法的位置重新标志为非法来释放占有的那个元素。

posted on 2012-10-15 13:46  mathlover  阅读(243)  评论(0编辑  收藏  举报

导航