字符串删除问题

在计算机的世界里,字符串问题可以说是一个很重要的问题,比如文本处理等等问题。今天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;
}
时间: 2024-10-12 09:00:31

字符串删除问题的相关文章

字符串函数(strcpy字符串拷,strcmp字符串比较,strstr字符串查找,strDelChar字符串删除字符,strrev字符串反序,memmove拷贝内存块,strlen字符串长度)

1.strcpy字符串拷贝拷贝pStrSource到pStrDest,并返回pStrDest地址(源和目标位置重叠情况除外) char *strcpy(char *pStrDest, const char *pStrSource) { assert(NULL!=pStrDest && NULL!=pStrSource); char *strTemp=pStrDest; while ((*pStrDest++ = *pStrSource++) != '\0'); return strTemp

python字符串删除,列表删除以及字典删除的总结

一:字符串删除  1,字符串本身是不可变的,一个字符串定义以后,对他本身是不能做任何操作的,所以的增删改都是对原字符串拷贝的副本的操作,原来的字符串还是原来的字符串,它本身并没 有变 2,字符串本身是不能修改的,但是可以通过其他方法来达到一个看似修改的效果,比如,切片+拼接   replace()替换,strip(), rstrip(),lstrip()去掉两端的字符 二:列表删除 1.pop(index) 2.remove(元素) 3.del 切片 4.clear()清空列表 三:字典删除 1

字符串删除指定符号(不限位置)

python中去掉字符串中某些不想要的字符: 1.一般的可以用replace() 这个函数不限定位置,是可以替换原来不想要的字符,替换成空 字符就相当于删除了 2.也可以用strip(),删除两边的字符(默认是删除左右空格) rstrip(),lstrip()这两个可以选择只删除左边或者右边 3.re.sub 这个可以根据正则删除,此处是删除串中的数字1-9,字符a-z,A-Z,还可以加其他的 import re str="aksj2343ngr4545g黄金叶子fg" temp =

C语言之基本算法40—字符串删除元音字母倒序输出

//字符串,数组 /* ================================================================== 题目: 输入一行字符,将辅音字母按反序输出(去掉元音字母),并存放在另一字符串! ================================================================== */ #include<stdio.h> #include<string.h> #define N 256 vo

字符串 删除 比较 查找 替换 大小写转换 长度 创建 拼接 截取 前后缀

#import <Foundation/Foundation.h> #define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]) int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str=[NSString stringWithForm

1092 To Buy or Not to Buy (字符串删除)

1092 To Buy or Not to Buy (20 分) Eva would like to make a string of beads with her favorite colors so she went to a small shop to buy some beads. There were many colorful strings of beads. However the owner of the shop would only sell the strings in

java字符串 删除指定字符的那些事

公司突然有这麽这需求: 1.算出2周以前的时间,以正常日期格式返回 2.如果月份和日期前面有0需要去掉返回结果,什么意思呢,比如:2017-08-15  就需要显示2017-8-15,你们说操蛋不,什么鬼需求,好了言归正传,直接撸代码. Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, -14);Date date = calendar.getTime();SimpleDateFormat sdf = n

字符串删除一个字符

这题看似简单,但是琢磨一下,还是挺有意思! /*-----完整代码@映雪------*/ #include <iostream> using namespace std; int main() { int i,j;/*两个游标*/ char a[10]; gets(a); for(i=j=0;a[i]!='\0';i++) if(a[i]!='c') a[j++]=a[i]; a[j]='\0'; puts(a); return 0; }

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$