剑指offer+名企面试官精讲典型编程题,28题扩展题

题目28扩展:求字符的所有组合
  eg:abc对应的组合a,b,c;a,b,c,ab,ac,bc,abc
思路: 分两步:n-1个字符串中长度为m-1的组合;n-1个字符的长度中长度为m的组合
  eg:3个字符abc,组成长度为1的组合 a -> (b,c)中取长度0的组合;(b,c)中取长度1的组合
      (b,c)中取长度1的组合 b -> (c) 中取长度0的组合; ( c) 中取长度1的组合
      最终就是a,b,c
递归出口:长度=0或者字符串到达末尾'\0'。
#include<iostream>
#include<string>
using namespace std;
void Combination(char* str,int length);
void combination(char* str,int length,string result);
void test(char* str,int length);
void test(char* str,int length)
{
        if(NULL==str)
                cout<<"origin str is NULL"<<endl;
        else
        cout<<"origin str="<<str<<endl;
        Combination(str,length);
}

void combination(char* str,int length,string result)
{
        if(*str=='\0'||length==0)
        {
                cout<<result<<endl;
                return ;
        }
        string tmp = result + *str;
        if( strlen(str+1)>=length-1 )
        {
                combination(str+1,length-1,tmp);
        }
        if(strlen(str+1)>=length)
        {
                combination(str+1,length,result);
        }
}
void Combination(char* str,int length)
{
        if(NULL==str||length<=0)
                return;
        string res;
        for(int idx = 1;idx<=length;++idx)
        {
                combination(str,idx,res);
        }
}
int main()
{
        char str[] = "abc";
        test(str,strlen(str));
        cout<<endl;

        char str2[] = "ab";
        test(str2,strlen(str2));
        cout<<endl;

        char* str3 = NULL;
        test(str3,0);
        cout<<endl;

        char str4[] = "";
        test(str4,1);
        cout<<endl;

        char str5[] = "a";
        test(str5,2);
        cout<<endl;

        system("pause");
}


猜你喜欢

转载自www.cnblogs.com/meihao1203/p/9152579.html