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

    问题描述

    给定字符串,求出该字符串的所有组合,即它的所有字串。例如“abc”,应该得到"a","b","c","ab","ac","bc","abc"。

    思路一

    如果没有要求按长度从小到大输出,可以逐位考虑是否选取,代码如下: 

     1 #include<stdio.h>
     2 #include<vector>  
     3 #include<cstring>
     4 using namespace std;
     5 
     6 const int maxn = 100 + 10;
     7 char str[maxn];
     8 vector<char>res;
     9 
    10 //字符串str已排序k个
    11 void Combination(char * str,int k,vector<char>res)
    12 {
    13     if (k == strlen(str))
    14     {
    15         for (int i = 0; i < res.size(); i++)
    16             printf("%c", res[i]);
    17         if(res.size()) printf("
    ");
    18         return;
    19     }
    20     Combination(str, k + 1, res);        //不选第k+1个
    21     res.push_back(str[k]);
    22     Combination(str, k + 1, res);        //选第k+1个  //不选写在前面,不存在要回溯的情况
    23 }
    24 
    25 
    26 int main()
    27 {
    28     scanf("%s", str);
    29     Combination(str, 0, res);
    30     return 0;
    31 }

    思路二

    如果要求按长度从小到大输出,我们可以先考虑长度为len的字串的所有组合,然后让len取1~strlen(str)即可得到所有组合。代码如下:

     1 #include<stdio.h>
     2 #include<iostream>  
     3 #include<vector>  
     4 using namespace std;
     5 
     6 const int maxn = 100 + 10;
     7 char str[maxn];
     8 vector<char>res;
     9 
    10 //字符串str的长度为len的有序排序
    11 void Combination(char* str, int cur,int len, vector<char> res)
    12 {
    13     if (len == 0)
    14     {
    15         for(int i = 0;i < res.size();i++)
    16             printf("%c", res[i]);
    17         printf("
    ");
    18         return;
    19     }
    20     if (cur == strlen(str))  return;    //未得到长为len的字串,要及时退出
    21     res.push_back(str[cur]);
    22     Combination(str, cur + 1, len - 1, res);
    23     res.pop_back();        //回溯
    24     Combination(str,cur + 1,len,res);
    25 }
    26 
    27 void solve(char* str)
    28 {
    29     int len = strlen(str);
    30     for (int i = 1; i <= len; ++i)        //枚举字串的长度
    31         Combination(str,0, i, res);
    32 }
    33 
    34 
    35 int main()
    36 {
    37     scanf("%s", str);
    38     solve(str);
    39 
    40     return 0;
    41 }

    参考链接:https://blog.csdn.net/geekmanong/article/details/50945067

  • 相关阅读:
    asp.net core 中TagHelper使用
    vs2015 添加命令提示工具
    关于MVC中Start.cs文件的作用
    Sql Server的两个小技巧
    用vue.js重构订单计算页面
    用vue.js实现购物车功能
    一步步实现自己的ORM(五)
    一步步实现自己的ORM(四)
    将Object转换成Dictionary方法
    一步步实现自己的ORM(三)
  • 原文地址:https://www.cnblogs.com/lfri/p/9882432.html
Copyright © 2011-2022 走看看