每天一道算法题(7)——在字符串中删除特定的字符
2015-05-22 11:51
453 查看
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They
are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy
r stdnts.”。
以下思路。查找时间复杂度为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赋空。
整体思路,从第一个删除的位置开始,依次把后面不需要删除的字符向前赋值
注意:1.source,key不能指向常量字符串,即source="abc"之类。
2.memset第2个参数不能是hashTable,否则sizeof结果是指针的空间大小4。
参考
1.在字符串中删除特定的字符
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.在字符串中删除特定的字符
相关文章推荐
- 每天一道算法题(7)——在字符串中删除特定的字符
- 每天一道算法题12 在字符串中删除特定的字符
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 一道算法题---把字符串内连续相同字符删除
- 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
- 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
- 算法题4 在字符串中删除特定的字符
- 【算法20】在字符串中删除特定的字符
- 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
- 【算法20】在字符串中删除特定的字符
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 每天一道算法题1 判断字符串是否是回文字符串或者是否含有回文字符子串
- 数据结构——算法之(022)( 在字符串中删除特定的字符)
- 面试题-在字符串中删除特定的字符[算法]
- 算法习题63:字符串删除特定字符
- 【字符串处理算法】删除特定的字符的算法设计及C代码实现
- [算法学习]在字符串中删除特定的字符
- 每天一道算法题(35)——删除字符串首尾的空格
- 每天一道算法题(35)——删除字符串首尾的空格
- 算法题40 在字符串中删除特定的字符。