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

    要求:输入一个字符串,输出该字符串的所有组合。如:若字符串为:abc,则应输出:(空集),a、b、c、ab、ac、bc、abc.

    思路:考虑到数学中的排列组合知识,我们知道所谓组合即是在字符串中选取某些字符组合在一起,而在二进制中我们可以用0代表未选取某字符,1代表选取了某字符,这样自然可以想到用位运算来实现该过程。位运算结果为1则代表该位被选取。如000代表空集,001代表选取最后一个字符,即c,100代表a。依次类推。

    注:注意全排列与组合的不同,具体请参看我的博客:字符串的排列

    基于上述思路,代码如下:
    #include<iostream>
    using namespace std;
    
    char str[] = "abcde";
    
    void print_subset(int n , int index)
    {
    	printf("{");
    	for(int i = 0 ; i < n ; ++i)
    	{
    		if( index&(1<<i) )         // 判断index的二进制中哪些位为1,即代表取某一位
    			printf("%c ",str[i]); //输出选取位对应的字符
    	}
    	printf("}
    ");
    }
    
    void subset(int n)
    {
    	for(int index= 0 ; index < (1<<n) ; index++)//因为长度为n的字符串的组合数为2^n,所以index<2^n(即1<<n)
    	{
    		print_subset(n,index);
    	}
    }
    
    int main(void)
    {
    	subset(5);
    	return 0;
    }
    程序运行结果如下:


  • 相关阅读:
    FZU 2150 Fire Game
    POJ 3414 Pots
    POJ 3087 Shuffle'm Up
    POJ 3126 Prime Path
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    字符数组
    HDU 1238 Substing
    欧几里德和扩展欧几里德详解 以及例题CodeForces 7C
    Codeforces 591B Rebranding
  • 原文地址:https://www.cnblogs.com/hainange/p/6334067.html
Copyright © 2011-2022 走看看