zoukankan      html  css  js  c++  java
  • C/C++中char* 与char []定义的区别

    转载请注明来自souldak,微博:@evagle

    Question:

    给你一个字符串例如abb输出它包含的字符的所有可能排列。

    例如abb输出3个:abb,bab,bba

    Answer:

    假设我们自己来做,那做法如下:

    1. 有n个字符相当于n个格子。

    2. 先放第一个格子,从n个字符中任选一个,放到这个格子即可,放完就剩下n-1个格子和n-1个字符

    3. 放第二个格子,从n-1个字符中任选一个

    。。。

    n. 最后一个格子,只剩下一个字符,不用选,输出放好的结果


    第二步到第n步其实问题本质是一样的,k个字符选一个,放到格子里即可。problem与subproblem的关系,所以我们可以用递归求解。

    1. 获得字符串s,得到长度n

    2. 轮询确定s[0]放哪个字符,共有n个,如果放第k个,就把s[k]放到s[0],s[0]放到s[k]

    3. 放好后就求解子问题,即求s[1]~s[n-1]的排列

    4. 如果已经求解到s[n-1],输出结果


    Attention:传入的str应该是char数组,不能是这样定义的:char* str = "abc"; 具体为什么请参看:C/C++中char* 与char []定义的区别

    //rm_dup: true for remove duplicated strings
    void permutation(char* str, int start, bool rm_dup){
        if(str==NULL||str=="")
            return;
        if(start==strlen(str)-1)
            cout<<str<<endl;
        bool visit[256];
        memset(visit,0,sizeof(visit));
        for(int i=start;i<strlen(str);i++){
            if(!visit[str[i]]||!rm_dup){
                visit[str[i]] = true;
                std::swap(str[start],str[i]);
                permutation(str,start+1,rm_dup);
                std::swap(str[start],str[i]);
            }   
        }   
    }



  • 相关阅读:
    预览图片功能 直接复制就OK
    记录:express返回自定义http状态吗
    Git tag 给当前分支打标签
    css双飞翼和圣杯布局
    简单模拟MVVM数据双向绑定
    JS的自定义事件(观察者模式)
    js模拟触发事件
    QueryString和BASE64
    WebResource.axd文件的配置和使用
    处理json中的异常字符
  • 原文地址:https://www.cnblogs.com/riskyer/p/3313368.html
Copyright © 2011-2022 走看看