輸出字串的子串
我們經常碰到這樣一個問題,怎樣快速輸出一個字串的子串,這種問題通常有兩種形式:
(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;
}
輸出結果:
推薦你用第二種方法,相信這會讓面試官眼前一亮的。
是不是很簡單,在對字串操作很多時候都會涉及到所有子串問題,所以掌握好它。