我们经常碰到这样一个问题,怎样快速输出一个字符串的子串,这种问题通常有两种形式:
(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;
}
输出结果:
推荐你用第二种方法,相信这会让面试官眼前一亮的。
是不是很简单,在对字符串操作很多时候都会涉及到所有子串问题,所以掌握好它。