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;
    }
    程序运行结果如下:


  • 相关阅读:
    Mybatis懒加载
    Mybatis 动态SQL
    Mybatis的多表查询
    linux selinux
    linux find/vi复制粘贴
    01-oracle限定查询-20190404
    awk
    sed
    windows删除指定日期前的文件
    win10 sshsecureshellclient删除profile保存的信息
  • 原文地址:https://www.cnblogs.com/hainange/p/6334067.html
Copyright © 2011-2022 走看看