zoukankan      html  css  js  c++  java
  • 字符串全部组合

    【问题】

    输入一个字符串。输出该字符串中字符的全部组合。举个样例。假设输入abc,它的组合有a、b、c、ab、ac、bc、abc。


    【分析解法1】

    对于字符串中每一个字符。仅仅有两种情况:一种就是出如今组合中,一种是不出如今组合中。

    【代码】

    void combination(char *str, char *res, int strPos, int resPos, int size)
    {
    	if (strPos == size) {
    		res[resPos] = '';
    		printf("%s
    ", res);
    		return;
    	}
    	combination(str, res, strPos+1, resPos, size);//str[strPos]不出如今组合中。

    res[resPos] = str[strPos]; combination(str, res, strPos+1, resPos+1, size);//str[strPos]出如今组合中。

    }

    【分析解法2(网上转载)】

    如果我们想在长度为n的字符串中求m个字符的组合。

    我们先从头扫描字符串的第一个字符。

    针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去。接下来我们须要在剩下的n-1个字符中选取m-1个字符;第二是不把这个字符放到组合中去,接下来我们须要在剩下的n-1个字符中选择m个字符。

    这两种选择都非常easy用递归实现。

    以下是这样的思路的參考代码:

    #include<iostream>  
    #include<vector>  
    #include<cstring>  
    using namespace std;  
    #include<assert.h>  
      
    void Combination(char *string ,int number,vector<char> &result);  
      
    void Combination(char *string)  
    {  
        assert(string != NULL);  
        vector<char> result;  
        int i , length = strlen(string);  
        for(i = 1 ; i <= length ; ++i)  
            Combination(string , i ,result);  
    }  
      
    void Combination(char *string ,int number , vector<char> &result)  
    {  
        assert(string != NULL);  
        if(number == 0)  
        {  
            static int num = 1;  
            printf("第%d个组合	",num++);  
      
            vector<char>::iterator iter = result.begin();  
            for( ; iter != result.end() ; ++iter)  
                printf("%c",*iter);  
            printf("
    ");  
            return ;  
        }  
        if(*string == '')  
            return ;  
        result.push_back(*string);  
        Combination(string + 1 , number - 1 , result);  
        result.pop_back();  
        Combination(string + 1 , number , result);  
    }  
      
    int main(void)  
    {  
        char str[] = "abc";  
        Combination(str);  
        return 0;  
    }  

  • 相关阅读:
    数据库 的几种链接 join
    eclipse 无法记住svn密码
    loadrunner监控linux服务器
    谷歌浏览器跨域命令行方式失效
    努力学习的意义到底在哪里?(转载知呼上的答案)
    人的性欲为什么会被视为坏事?(转载)
    npm下载速度太慢
    使用systemback制作Ubuntu自定义系统镜像和系统备份(抄)
    使用bat脚本永久激活Windows系统(摘抄)
    fiddler软件测试——Fiddler抓取https设置详解(图文)(摘抄)
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7263111.html
Copyright © 2011-2022 走看看