美文网首页
2. 字符串的全部组合

2. 字符串的全部组合

作者: 鬼谷神奇 | 来源:发表于2016-02-24 15:22 被阅读27次

题意:输出给定字符串的全部组合,如:输入abc, 输出a,b,c,ab,ac,bc,abc

算法实现

1. 递归实现

算法思想:假设从n个字符中选择m个字符,从头扫描字符串的第一个字符,针对第一个字符,有两种情况:

  1. 在所选择的m个字符中,则在剩下的n-1个字符中,选择m-1个字符
  2. 不在所选择的m个字符中,则在剩余n-1个字符中,选择m个字符
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <assert.h>

using namespace std;

void Combine(char * str, int num, vector<char> & result)
{
    if(num == 0)
    {
        for(int i = 0; i < result.size(); ++i)
            cout << result[i];
        cout << endl;
        return;
    }

    if(*str == '\0')
        return;

    result.push_back(*str);
    Combine(str+1, num-1, result);
    result.pop_back();

    Combine(str+1, num, result);
}

int main()
{
    //ifstream cin("in.txt");

    char str[100];
    while(cin >> str)
    {
        assert(str != NULL);
        int len = strlen(str);
        vector<char> ret;

        for(int i = 1; i <= len; ++i)
        {
            Combine(str, i, ret);   
        }
    }

    return 0;
}
2. 位运算实现
  • 算法思想:n个字符的所有组合中,每个字符要么存在,要么不存在,共有32种,其中一种为空。如果使用0或1表示每位是否出现,则对于32中的任一种情况,只需计算1出现的位置,并输出响应位置的字符即可。如:10110,则输出str[1],str[2],str[4](翻转后为01101)
  • abc 输出结果为: a, b, ba, c, ca, cb, cba
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

string str;

void subset(int n, int num)
{
    cout << "(";
    for(int i = n-1; i >= 0; --i)  //逆序遍历,可以实现字典序输出
        if(num & (1 << i))
            cout << str[i];
    

    cout << ")" << endl;
}

int main()
{
    ifstream cin("in.txt"); 

    
    while(cin >> str)
    {
        int len = str.length();

        for(int i = 0; i < (1 << len); ++i)
        {
            subset(len, i);
        }

    }

    return 0;
}

3. 递归法,字典序输出
#include<stdio.h>

char num[]="abcde";
char rcd[26];

void full_combination(int l,int p)
{ 
    int i; 
    for(int i=0;i<l;i++) 
    { 
        printf("%c",rcd[i]); 
    } 
    printf("\n"); 

    for(i=p;i<5;i++)
    { 
        rcd[l]=num[i]; 
        full_combination(l+1,i+1); 
    }
}
int main()
{ 
    full_combination(0,0);

    return 0;
}

相关文章

  • 2. 字符串的全部组合

    题意:输出给定字符串的全部组合,如:输入abc, 输出a,b,c,ab,ac,bc,abc 算法实现 1. 递归实...

  • Swift-字符串排列

    题目:确定某字符串的全部排列组合. 核心代码: 测试代码:

  • R学习笔记(5):使用stringr处理字符串(1)

    1. 创建字符串 2. 求字符串长度 3. 组合字符串 4. 取子串 该函数还能用于赋值

  • stringr

    • 1.检测字符串长度 str_length(x) • 2.字符串拆分与组合 str_split( ) /str_...

  • 开发中易用的小技巧

    1. 字符串的处理 字符串分割以及将数组组合成字符串 2.多级模态界面 开发中有时候需要连续出来多个界面, 但是可...

  • 字符串的全组合

    字符串的全组合 题目描述: 输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、...

  • 排列和组合问题的PHP实现

    1.排列 给定一个字符串,比如:abcd,输出这个字符串的所有排列。 2. 组合 给定一个字符串,比如:abcd,...

  • stringr 12-2

    数据准备 1.检测字符串长度 2.字符串拆分与组合 3.提取字符串的一部分 4.大小写转换 5.字符串排序 6.字...

  • 删除全部容器

    查看运行容器 查看所有容器 进入容器 其中字符串为容器ID: 1.停用全部运行中的容器: 2.删除全部容器: 3....

  • stringr-处理字符的函数

    准备工作:安装R包载入数据 1.检测字符串长度 2.字符串拆分与组合 可以看出拆分后,向量变成了列表,可以通过列表...

网友评论

      本文标题:2. 字符串的全部组合

      本文链接:https://www.haomeiwen.com/subject/zkcikttx.html