今天上午面试问了个问题求字符串子串,给出一个任意字符串要求按照a^nb^n(n>=2)输出,n为字符重复次数,例如给一个字符串“aaabbbcc1234ddee”,输出为aaabbb,aabb,bbcc,ddee。用C/C++写
水平不行,写了半天写了代码运行总出错,有大哥帮写个代码或者帮我改下吗?
void selectout (char * str)
{
char *p = str;
char out[40] = {};
int iLena = 0;int iLenb = 0;
bool b = true;
if(*str == NULL)
{
return;
}
while(*p != *(p + 1))
{
str++;
select(str);
}
out[0] = *p;p++;iLena++;
while(out[0] == *p)
{
out[iLena] = *p;
iLena ++;
p++;
}
out[iLena] = *p;iLenb ++;
for(int i = 0; iLena >= 2,i < iLena -1; i++)
{
p++;
if(out[iLena] != *p)
{
b = false;
break;
}
out[iLena + i + 1] = *p;iLenb ++;
}
if(b)
{
out[iLena *2 +1] = '\0';
printf("%s",out);
//system("pause");
str++;select(str);
}
str++ ;select(str);
}
自己解决了~
void selectout (char * str)
{
char *p = str;
char temp[2]; //存储子串中的两个字符
int iNumA = 1;//记录第一个重复字符串的个数
int iNumB = 1;//记录第二个重复字符串的个数
int iMin = 0;//相邻字符重复字符个数较少的
if((str == NULL) || strlen(str) < 4)
return;//为空或小于4个字符返回(至少要四个字符才能配对
while(*p != *(p + 1))
p++;//从第一个字符开始判断,第一个字符不等于第二个的时候不符合条件
while(*p == *(p + 1))
{ temp[0] = *p;
p++;
iNumA++;
}
p++;//如aabb中a遍历完毕,开始下一个字符的遍历
while(*p == *(p + 1))
{
temp[1] = *p;
p++;
iNumB++;
}
if(iNumB >= 2)
{//相邻字需多于两个
iMin =(iNumA > iNumB) ? iNumB : iNumA;//如aabbb中取2
for(int i = 2; i <= iMin; i++)
{//重复字符个数多余2个的,需从iMin打印到2,如aaaabbbb,分别打印aabb,aaabbb,aaaabbbb
for(int j = 0; j < 2 * i; j++)
{
if(j < i)
cout<<temp[0];
else
cout<<temp[1];
}
cout<<" ";
}
selectout(p-iNumB);//配对成功,需从相邻的字符第一个开始进入递归,如aabbdef,从第一个b进入递归
}
else
{//说明该字符是孤立的,如aabdd中的b,从d进入递归
selectout(p++);
}
}