zoukankan      html  css  js  c++  java
  • 每天一道算法题(7)——在字符串中删除特定的字符

        题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”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='';
    	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='';
    }





    参考

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



  • 相关阅读:
    falsk-web 表单
    falsk-web 表单
    falsk-web 表单
    falsk-web 表单
    治理“假货之都”需要大数据打假
    治理“假货之都”需要大数据打假
    治理“假货之都”需要大数据打假
    治理“假货之都”需要大数据打假
    与好友合伙创业,他开店4家,月销售额已超过30万元
    放弃优越的都市生活,他返乡创业带动家乡人民共同致富
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393044.html
Copyright © 2011-2022 走看看