1. 程式人生 > >輸出字串的子串

輸出字串的子串

     我們經常碰到這樣一個問題,怎樣快速輸出一個字串的子串,這種問題通常有兩種形式:

(1)輸出連續子串

例如:假設字串的長度為n,其非空子串的數目為你n(n+1)/2個。例如字串“abc“的連續子串有 a,b,c,ab,bc,abc,利用程式碼實現就有

這個其實比較簡單,下面我們來看一下另一種形式。

(2)輸出所有的子序列

假設字串的長度為n,其非空子串的數目為2^n-1個(注意這裡包含不連續的子串哦)。還是以“abc”為例,其所有子序列為a,b,c,ab,ac,bc,abc.輸出程式碼如下:

#include<iostream>
#include<string.h>
#include<vector>
#include<string>
using namespace std;

////case 1
void combine(const char str[])
{
    if(str==nullptr||*str==0)
        return;
    const int MAX=64;
    int len=strlen(str);
    bool used[MAX]={0};
    char cache[MAX];
    char *res=cache+len;
    *res=0;
    while(1)
    {
       int index=0;
       while(used[index])
       {
          used[index]=false;
          ++res;
          if(++index==len)
              return ;
       }
       used[index]=true;
       *--res=str[index];
       printf("%s ",res);
    }

}


////case 2
void suoyou(char str[])
{
    int len=strlen(str);
    int num=1<<len;
    vector<string>ve;
    for(int i=1;i<num;i++)
    {
       string ss;
       for(int j=0;j<len;j++)
       {
          if(i&(1<<j))   ss.push_back(str[j]);
       }
       ve.push_back(ss);
    }

    for(int k=0;k<ve.size();k++)
    {
       cout<<ve[k]<<endl;
    }

}


int main()
{
    char str[100];
    cin>>str;
    combine(str);
    printf("\n");
    suoyou(str);
    return 0;
}
輸出結果:

推薦你用第二種方法,相信這會讓面試官眼前一亮的。

是不是很簡單,在對字串操作很多時候都會涉及到所有子串問題,所以掌握好它。

attention::子串指的是串中任意個連續的字元組成的子序列,稱為該串的子串。

                      而子序列可以是不連續的!!!