每天一道算法题(7)——在字符串中删除特定的字符

news/2024/7/4 8:20:10

    题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.””aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”


1.思路

       最简单的。设source长n,key 长m(n>>m),则使用简单的遍历查找需要n*m次(n个字符,查找m次),且每次删除对应元素需要O(1)时间(元素移动)。时间复杂度为O(n.^2);

       以下思路。查找时间复杂度为O(n),删除时间复杂度为O(n)。即O(n)的时间内完成。

       1)建立长度为256(char元素总数)的hash数组(类似基排序),遍历key。即需要在source中删除的字符在hashtable上不为0。复杂度O(m)。

      2)设定指针 temp和needDelete,初始化指向source.

      3)temp用来遍历source,任何时候指向不需要删除的字符。needDelete指向当前需要删除的第一个字符。

      4)使用间接删除法。即将temp的值赋给source。

      5)任何一轮循环。needDelete--temp-1的字符都可以被删除(即替代)。temp之前不需要删除的字符,都已经挪到needDelete之前。

      6)以temp为空位结束条件。最后给needDelete赋空。

            整体思路,从第一个删除的位置开始,依次把后面不需要删除的字符向前赋值

2.代码

#include"iostream"
using namespace std;

char* deleteStr(char*source,const char* key){
	if(!source||!key)
		return NULL;
	const char*temp=key;
	//static int hashTable[256];
	int* hashTable=new int[256];
	memset(hashTable,0,256*sizeof(int));

	while(*temp)
		hashTable[*temp++]++;
	temp= source;
	char *needDelete=source;
	while(*temp){
	   if(!hashTable[*temp]){//不需要删除的字符,前移赋值
		   *needDelete=*temp;
		   needDelete++;
	   }
	   temp++;
	}
	*needDelete='\0';
	delete []hashTable;
	return source;
}
void main(){
    char source[]="big china, little japan.";
    char key[]="aeioujh";

	cout<<deleteStr(source,key)<<endl;
}


注意:1.source,key不能指向常量字符串,即source="abc"之类。

           2.memset第2个参数不能是hashTable,否则sizeof结果是指针的空间大小4。


3.其他

    给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:"   i    am a      little boy.    ",变成"i am a little boy"


void FormatString(char str[],int len){
   if(!str||len<=0)
       return;
   char *needDelete=str;  
   if(*needDelete==' ')
   while(*str==' ')
       str++;
   while(*str){  
       if(*str!=' '||*str==' '&&*(str+1)&&*(str+1)!=' '){
           *needDelete=*str;  
           needDelete++;  
       }  
       str++;  
    }  
    *needDelete='\0';
}





参考

        1.在字符串中删除特定的字符



转载于:https://www.cnblogs.com/engineerLF/p/5393044.html


http://www.niftyadmin.cn/n/3879831.html

相关文章

将文本藏入图片 选择自 VirleneCheng 的 Blog

一般看来文字与图片是毫不相同的&#xff0c;但是它们却有共同点。图片是由一个个点组成的&#xff0c;而这些点的颜色值可由数字组成&#xff0c;文字可由ASCII码表示&#xff0c;这就使得数字成为它们之间沟通道桥梁。因此就可以将文本藏入图片中。这可以用Visual Basic 6.0实…

创建组件“AxLicenseControl”失败

打开以前的程序&#xff0c;准备来添加一个功能&#xff0c;打开主程序就报错&#xff1a; 我未曾改变过版本&#xff0c;原来是由于破解测试需要&#xff0c;修改了系统时间&#xff0c;时间对不了&#xff0c;ArcGIS的问题&#xff0c;改过来就正常了。

在中文下打开日文文件:)

private void button1_Click(object sender, System.EventArgs e) { openFileDialog1.Filter "所有文件*.*|*.*|文本文件*.txt|*.txt"; openFileDialog1.FilterIndex 2; if(openFileDialog1.ShowDialog ()DialogResult.OK ) { FileStream frnew FileStre…

php数组函数序列之array_unshift() 在数组开头插入一个或多个元素

array_unshift() 函数在数组开头插入一个或多个元素。被加上的元素作为一个整体添加&#xff0c;这些元素在数组中的顺序和在参数中的顺序一样 array_unshift()定义和用法 array_unshift() 函数在数组开头插入一个或多个元素。 被加上的元素作为一个整体添加&#xff0c;这些元…

EFFECTIVE-C++读书笔记

读书笔记2. 构造/析构/赋值运算条款05&#xff1a; 了解C默默编写并调用了哪些函数条款06&#xff1a;若不想使用编译器自动生成的函数。就该明确拒绝条款07&#xff1a;为多态基类声明virtual析构函数条款08&#xff1a;别让异常逃离析构函数条款09&#xff1a;绝不在构造和析…

HDU_1166_敌兵布阵

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 54389 Accepted Submission(s): 22819 Problem DescriptionC国的死对头A国这段时间正在进行军事演习&#xff0c;所以C国间谍头子Derek和他手下Tidy又开…

关于鼠标和键盘的全局获取的一个类 选择自 hbxtlhx 的 Blog

用这个类的方法Start可以开始捕获键盘和鼠标的在全局事件和相应的参数信息&#xff0c;也就所谓的钩子程序&#xff1a; 以前见一个高人写的一个程序&#xff0c;开始看不明白&#xff0c;经过我的&#xff02;反译&#xff02;变的好理解了些&#xff0c;拿来和大家共享一下&a…

webstrom 编码

设置文件保存格式: webstrom的右下角选择你需要的编码 转载于:https://www.cnblogs.com/ry123/p/4531403.html