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;  
    }  

  • 相关阅读:
    B2B商城网站前端开发
    Scss开发临时学习过程||webpack、npm、gulp配置
    移动开发注意几点
    拥有的50个CSS代码片段(上)
    css3基础、(弹性、响应式)布局注意点
    js封装、简单实例源码记录
    ES8
    es7与es8
    Iterator
    Math,Number
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7263111.html
Copyright © 2011-2022 走看看