字符串组合求法

题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

上面我们详细讨论了如何用递归的思路求字符串的排列。同样,本题也可以用递归的思路来求字符串的组合。

方法一:
假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;第二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。下面是这种思路的参考代码:

#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个组合\t",num++);

        vector<char>::iterator iter = result.begin();
        for( ; iter != result.end() ; ++iter)
            printf("%c",*iter);
        printf("\n");
        return ;
    }
    if(*string == ‘\0‘)
        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;
}

由于组合可以是1个字符的组合,2个字符的字符……一直到n个字符的组合,因此在函数void Combination(char* string),我们需要一个for循环。另外,我们用一个vector来存放选择放进组合里的字符。
方法二:用位运算来实现求组合

#include<iostream>
using namespace std;

int a[] = {1,3,5,4,6};
char str[] = "abcde";

void print_subset(int n , int s)
{
    printf("{");
    for(int i = 0 ; i < n ; ++i)
    {
        if( s&(1<<i) )         // 判断s的二进制中哪些位为1,即代表取某一位
            printf("%c ",str[i]);   //或者a[i]
    }
    printf("}\n");
}

void subset(int n)
{
    for(int i= 0 ; i < (1<<n) ; ++i)
    {
        print_subset(n,i);
    }
}

int main(void)
{
    subset(5);
    return 0;
}

题目:输入两个整数n和m,从数列1,2,3...n中随意取几个数,使其和等于m,要求列出所有的组合。

#include <iostream>
#include <list>
using namespace std;
list<int> list1;
void find_factor(int sum,int n)
{
    //递归出口
    if(n<=0||sum<=0)
        return;
    //输出找到的数
    if(sum==n)
    {
        list1.reverse();
        for(list<int>::iterator iter=list1.begin();iter!=list1.end();iter++)
            cout<<*iter<<"+";
        cout<<n<<endl;
        list1.reverse();
    }
    list1.push_front(n);
    find_factor(sum-n,n-1);//n放在里面
    list1.pop_front();
    find_factor(sum,n-1);//n不放在里面
}

int main(void)
{
    int sum,n;
    cin>>sum>>n;
    cout<<"所有可能的序列,如下:"<<endl;
    find_factor(sum,n);
    return 0;
}
时间: 2024-08-05 14:57:00

字符串组合求法的相关文章

【51CTO/BBS】请教: SQL里有没有字符串组合Join的函数??

[51CTO/BBS]请教: SQL里有没有字符串组合Join的函数?? 原帖地址:http://bbs.51cto.com/thread-1133863-1.html 问题描述: VB 中有两个非常好用的字符串处理函数: Split(字符串,分隔符)作用:将[字符串]以[分隔符]作为边界,分解成数组. 返回:一个字符串数组. Join(字符数组,分隔符)作用:将[字符数组]中的元素,以[分隔符]作为边界,连接成一个字符串.返回:一个字符串. 请教老师们,SQL里是否有类似的函数? 解决方案:

javascript 写了个字符串组合的情况

function log() { var i = 0, str = '', args = [].slice.call(arguments); j++; if (isRepeat(args)) { k++; return; } while(i < args.length) { str += chars[args[i]]; i++; } console.log(str); } function count(obj) { var i = 0; for (var p in obj) { if (obj.

转:去掉重复的字符串组合

转自:http://bbs.csdn.net/topics/310249367 超级大笨狼 题目:有一个字符串数组 List<string>="abc","bac","acb".....10万个元素,每个长度在3到16个字符.只保留其中一个组合,也就是说对于字符串内容相同,只是字符组合顺序不同的字符串进行删除.要求结果在一秒内算出. 下面是输入的数据: static void Main(string[] args)         {

python每天1道面试题(3)--字符串组合

""" 题目3:输入一个字符串,输出该字符串中字符的所有组合. 举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 解题思路: 先用列举法,举例出组合元素长度分别是1,2,..,len(str)时的具体元素, 然后发现当数组长度>=3之后的规律是一致的, 前n个字符合体即li[:m],拼接上后面li[m:]的每一个字符. """ def compose_str(str): li = [i for i in str]

poj3267--The Cow Lexicon(dp:字符串组合)

The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8211   Accepted: 3864 Description Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their c

55. 2种方法求字符串的组合[string combination]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-combination.html [题目] 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. [分析] 在之前的博文28.字符串的排列[StringPermutation]中讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. [递归法求组合] 可以考虑求长度为n的字符串中m个字符的组合,

字符串的排列和组合问题

1.字符串的全排列 题目:{a,b,c}要求输出{abc,acb,bac,bca,cab,cba}. 字符串全排列可以把字符串看成两个部分,第一个部分为它的一个字符,第二部分是后面的字符. 分两步完成:首先求所有可能出现在第一个位置的字符,即把第一个字符与后面的所有字符交换.第二步固定第一个字符,求后面所有字符的排列.从中可以看出是典型的递归思路. 1 public void helper(char[] array, int cur){ 2 if ( cur == array.length -

SQL Server如何用SQL实现一批字符串的全部组合

原文:SQL Server如何用SQL实现一批字符串的全部组合 在SQL Server中,如何用SQL去实现得到一批字符串的全部组合呢?这个是同事在实际需求当中遇到的一个问题,他的具体需求如下所示: 传入参数格式为'1,2,3,224,15,6'   'A,BC,GHT,TTY,B,E' 输出的内容为分割后字符串的所有非排列组合 !-阶乘,如!=5××××=120  (M!/(N!*((M-N)!))) 公式描述:组合数公式是从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中

Python3 字符串

字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' var2 = "Runoob" Python 访问字符串中的值 Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用. Python 访问子字符串,可以使用方括号来截取字符串,如下实例: 实例(Python 3.0+) #!/usr/bin/python3 var1 = '