看了两道题
一道是原地压缩字符串 例如把aaabbcdddd变为a3b2cd4
另一道是,给定一个字符串s和另外一个字符串t,in-place操作,删除s中所有在t中出现过的字符
这种题目都是一个套路,使用两个char*的指针,fast和slow
以第二题为例:
fast和slow一开始都指向初始的字符串s
遍历fast,如果fast指向的字符在t中出现过,则跳过。如果fast指向的字符没有在t中出现过,则将fast指向的字符赋给slow,slow指向下一个位置。
最终不要忘记把slow加上字符串结束符'\0'
这里贴一个第一道题的代码,考虑到代码方便我只写了相同字符数不超过9的方法,如果扩展只需要在这个层面上扩展即可
char* compress(char* s){
assert(s!=NULL);
char *fast=s,*slow=s;
int count = 0;
while(*fast){
count = 0;
char res = *fast;
while(*fast==res){
fast++;
count++;
}
if(count==1)
slow++;
else{
*slow++ = res;
*slow++ = count+'0';
}
}
*slow = '\0';
return s;
}