删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是O(N^2);那么有没有O(N)的方法呢?
比如 "abcdeccba" 删除字符 "c"。使用2个指针,一前一后,比较前面的指针和删除字符:
- 不相等,两个指针一起跑,且前面的指针值拷贝到后面指针指向的空间
- 相等时,快指针向前一步
char *delete_occurence_character(char *src , char target){
char *front = src;
char *rear = src;
while(*front != '\0'){
if (*front != target){
*rear = *front;
rear++;
}
front++;
}
*rear = '\0';
return src;
}
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
这是上个题目的升级版本。
char *delete_occurence_characterset(char *source,const char *del);
- 蛮力法。 遍历字符串,每个字符去删除字符串集合中查找,有就删除
- 使用上面的方式,一次遍历
如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N)) 这道题跟上一道题也是一个意思。
示例代码:
char *trim_number(char *source){
char *start = source;
char *end = source;
if (source == NULL) return NULL;
while(*end != '\0'){
if (*end < '0' || *end > '9' ){
*start = *end;
start++;
}
end++;
}
*start = '\0';
return source;
}