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.在字符串中删除特定的字符



  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393044.html
Copyright © 2011-2022 走看看