跳转至

字符串 - 删除

删除串中指定的字符

删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是 O(N^2); 那么有没有 O(N) 的方法呢?

比如 "abcdeccba" 删除字符 "c"。使用 2 个指针,一前一后,比较前面的指针和删除字符:

  1. 不相等,两个指针一起跑,且前面的指针值拷贝到后面指针指向的空间
  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);
  1. 蛮力法。 遍历字符串,每个字符去删除字符串集合中查找,有就删除
  2. 使用上面的方式,一次遍历

删除字符串中的数字并压缩字符串

如字符串”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;
}