题目:
给出一个字符串,找出相邻且相同的字符,并删除它们。
在该字符上反复执行上述操作,知道无法继续删除。
在完成所有重复项删除操作后返回最终字符串。
限制:
1<=输入字符串长度<=2000
输入字符串仅为小写字母组成
思路:
1.存储: 用一个字符数组存储输入的字符串。
2.判断相邻重复:编写辅助函数,利用索引i、i+1,判断是否重复,有的话就返回true
3.删除重复字符:编写辅助函数,因为要做删除操作,所以读取字符串个数一定大于等于写入字符串个数。可以利用两个索引,读写,同时对字符串进行遍历。
最后一个字符串或者没有相邻重复字母:不需要删除,读位置 写道 写位置即可。
多个字符相邻重复:while循环判断重复结束,只需要增加读索引即可。后面读到不重复的,读索引的字符写到 写索引的位置即可,覆盖掉重复的字符。
最后写索引尾部加'\0',
代码:
//辅助函数:检查字符串相邻字母是否有相同的字符
bool repeate(const char *str)
{
int len = strlen(str);
for(int i=0; i<len-1; i++)
{
if( str[i] == str[i+1] )
return true;
}
return false;
}
//主函数:用于删除相邻且相同的字母
void de(char *str)
{
int len = strlen(str);
int writeindex =0;
for(int readindex=0; readindex<len; readindex++)
{
//最后一个字符 或者 没有重复的
if(readindex==len-1 || str[readindex] != str[readindex+1])
str[writeindex++] = str[readindex];
else{ //多个重复的字符相邻
while( str[readindex] == str[readindex+1] )
readindex++;
}
}
str[writeindex]='\0';
}
int main(){
char str[100]={0};
printf("input string:");
scanf("%s",&str);
while(repeate(str) )
{
de(str);
}
printf("finaly: %s", str);
return 0;
}
运行结果:
一点点的思考:
思考1:一个数组 的 读、写索引。
需要修改数组时(增删改),都可以利用两个索引来进行操作,很方便。不需要再搞一个空的大小一样的数组来存放。
思考2:判断一件事的真假,决定要不要去操作。
判断一个事件的真假,用while循环去执行,知道这件事不需要操作了。