字符串消除
心理信管计算概论 练习6 D
描述
在一个字符串中,从左到右遍历把连续的相同字符全部删除, 然后将剩下的字符组成新的字符串,继续遍历删除相邻的相同字符,直到没有可以删除的字符为止。
例如:字符串asssaasddsc,
第一遍删除三个s,两个a,两个d,得到字符串**‘assc’**。
第二遍删除两个**‘s’,得到字符串’ac’**。
删除结束,输出字符串‘ac’
输入
输入一行,代表要进行消除的字符串,字符串长度不超过1000
输出
输出一行,代表消除后的字符串,如果字符串全部都被消除,输出“null”
样例输入1
asssaasddsc
样例输出1
ac
样例输入2
hhhhhhhhjkkkkkkkkkkklllj
样例输出2
null
代码
#include <stdio.h>
#include <string.h>
#include <math.h>
char a[1001];
int n;
int dele()//人生删除事务所!!
{
int s = 0;
int k = 0;
char tmp[1001];
for (int i = 0; i < n-1; i++)
{
if (a[i] == a[i + 1])//如果没有把中间的0跳过是不能直接让a[i]和a[i+1]比较的
{
for (int j = 0; j < n - i; j++)
{
if (a[i + j] != a[i])
{
for (int l = i; l < i + j; l++)
{
a[l] = '0';
}
i = i + j-1;//注意这里是需要减1的,因为进行下一个循环的时候i++还会再加上一个1,如果不减a[i+j]就被跳过了
break;
}
if (i + j == n - 1)//对于'……aaa'字符串,就不能用上面的方法删除,因为没有下一个不一样的a[i+j]了
{
for (int l = i; l <= i + j; l++)
{
a[l] = '0';
}
}
}
s = 1;
}
}
for (int i = 0; i < n; i++)
{
if (a[i] != '0')
{
tmp[k] = a[i];//把中间的0直接跳过
k++;
}
}
tmp[k] = '\0';//结尾需要补\0才能copy
strcpy(a, tmp);
return s;
}
int main()
{
scanf("%s", a);
n = strlen(a);
int s=1;
while (dele())//应该是先运行了dele之后再判断,但是如果dele返回值为0(即删到最后一步了),就不会再计算a的长度了,所以需要补一句
{
n = strlen(a);
}
n = strlen(a);
if (n == 0)
{
printf("null");
return 0;
}
printf("%s", a);
return 0;
}