Skip to content

Latest commit

 

History

History
71 lines (49 loc) · 1.7 KB

1.2 字符串-删除.md

File metadata and controls

71 lines (49 loc) · 1.7 KB

字符串-删除

删除串中指定的字符

删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是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;
}