zoukankan      html  css  js  c++  java
  • 生成一个序列所有排列的算法

    递归算法比较简单

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

  • 相关阅读:
    SpringMVC请求参数接收总结(一)
    不用 Spring Security 可否?试试这个小而美的安全框架
    @ConfigurationProperties 注解使用姿势,这一篇就够了
    Spring Aware 到底是什么?
    git rebase VS git merge? 更优雅的 git 合并方式值得拥有
    Spring Bean 生命周期之destroy——终极信仰
    面试还不知道BeanFactory和ApplicationContext的区别?
    Java设计模式学习记录-享元模式
    Java设计模式学习记录-外观模式
    Java设计模式学习记录-装饰模式
  • 原文地址:https://www.cnblogs.com/mathlover/p/2724189.html
Copyright © 2011-2022 走看看