字符串的组合

一:用递归实现


#include<iostream>

#include<vector>

#include<cstring>

#include<cstdlib>

using namespace std;


void CombinationCore(char * str, int len, vector<char> &rs)

{

    if(len == 0)//相当于此时的组合串的长度满足最开始的要求了,即m==0

    {

        vector<char>::iterator it;

        for(it = rs.begin(); it < rs.end(); it++)

            cout<<(*it);

        cout<<endl;

        return;

    }

    if(*str == '\0')//即n == 0

        return;

    rs.push_back(*str);

    //把当前字符当做组合的一部分

    CombinationCore(str + 1,len - 1,rs);

    rs.pop_back();//删除当前字符,恢复之前的状态

    //不把当前字符作为组合的一部分

    CombinationCore(str + 1, len,rs);

}

void getCombination(char* str)

{

    if(str == NULL)

        return;

    int length = strlen(str);

    vector<char> rs;

    for(int i = 1; i <= length; i++)

        CombinationCore(str,i,rs);

}

int main()

{

    char s[] = "abcd";

    getCombination(s);

}

二:数组的组合问题

#include <iostream>

using namespace std;

//深度优先搜索
//10个数中  3个数的组合问题
const int n=5,k=3;   
int a[]={0,1,2,3,4,5};  //第一个数不算
int res[n];
/*
   两个标志
   kk代表组合中的第几个数
   start从哪个位置开始选择数字  
   在可重复的情况下,start一直为1
*/
void dfs(int kk,int start)
{
  if(kk>k)
  {
     for(int i=0;i<=k;i++)
         cout<<res[i]<<" ";
     cout<<endl;
     return;
  }
  for(int i=start;i<=n;i++)
  {
    res[kk]=a[i];
    dfs(kk+1,i+1);     //只有这一行代码与上一个问题代码不同
  }
}

int main()
{
    dfs(0,0);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/runner668/article/details/82179009