在計算機的世界裏,字符串問題可以說是一個很重要的問題,比如文本處理等等問題。今天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;
}