在计算机的世界里,字符串问题可以说是一个很重要的问题,比如文本处理等等问题。今天Mayuyu就来讲述一个字符串删除问题,问题描述如下
问题:给定一个很长的字符串,比如长度为1000000,现在要删除这个字符串中某些指定的字符,这些指定的字符只
有几个,现在Mayuyu要求是尽量用最少的时间和空间来做这件事。
分析:很明显,可以从前往后扫描,遇到一个指定的字符就删除,然后把后面的往前移动。很显然,这样做时间复杂度
太大啊,所以很有必要设计一个比较好的算法。其实可以这样考虑,我们可以用两个指针从前往后扫描,遇到需
要删除的就将后面的字符串拿来覆盖之前的,这样下去时间复杂度是O(n)的,而且不需要开额外空间。至于怎
么找指定的字符是否存在,只需要先用一个数组预处理即可。
代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int flag[123]; //大写字母和小写字母的ASCII值最多到122
void Init(const char *str)
{
memset(flag, 0, sizeof(flag));
while(*str)
flag[*str++] = 1;
}
void Delete(char *str)
{
char *pFast = str;
char *pSlow = str;
while(*pFast)
{
if(!flag[*pFast])
*pSlow++ = *pFast++;
else
pFast++;
}
*pSlow = 0;
}
int main()
{
char source[] = "Hello Mayuyu!!!";
char word[] = "Hello";
Init(word);
Delete(source);
cout << source << endl;
return 0;
}