删除串中相同的元素:一个做法
来源:互联网 发布:sqlserver分布式查询 编辑:程序博客网 时间:2024/06/02 22:04
有一个问题,如何删除两个字符串相同的字符,比如
str1 = "abcdeafg" str2 = "blimklaaaaa"
要得到:
str1 = "cdefg" str2 = "limkl"
下面直接写程序,这个程序是我写的,但是思想是别人的,呵呵
为了方便讨论,假设str1 和 str2 都是ascii码
这样做的原理是用空间换时间,牺牲了256个整数的空间(可以用char temp[256]来代替),三遍并列的循环可以把两个数组的相同的元素找出来。如果用常规办法的话,估计要嵌套循环3遍~
如果是unicode嘛,可以设int temp[65536];
如果是多字节编码,这个...我也没想过~
下面看这个 void delChar(char *str, char ch);的实现。
因为要删掉所有的i,如果是常规做法,每删一个元素,后面的就要往前面移动,那就用比较多的时间了。
下面换个做法,看这个代码:
这个代码的思想和常规的不同,移动过去的是不想删掉的,要删的反而不移动它。这样仅需要扫描一次就可以了。
这个样子实现,整个程序最多仅需扫描5次字符串就可以做完任务了。
还可以扩展,如果删除多个字符串的相同字符,都是这样处理,而且复杂度都是O(N)
至于还能不能简化???我现在想不出来,各位请多多指教啊,在下感激不尽,呵呵。
注:这个delChar的程序的想法是参考STL algorithm中的unique的源码得到的,特此说明。
str1 = "abcdeafg" str2 = "blimklaaaaa"
要得到:
str1 = "cdefg" str2 = "limkl"
下面直接写程序,这个程序是我写的,但是思想是别人的,呵呵
为了方便讨论,假设str1 和 str2 都是ascii码
- void delSameChs(char *str1, char *str2)
- {
- //ascii码是0-255,(准确的说是0-127),所以定义一个临时数组,其下标就是ascii码
- //其元素是出现在下标i出现在str1,str2的次数
- int temp[256];
- char *pStr1 = str1;
- char *pStr2 = str2;
- memset( &temp, 0, sizeof(temp) ); //清0
- while( '/0' != *pStr1 ) //遍历str1,在temp中设为1
- {
- temp[ *pStr1 ] = 1;
- pStr1++;
- }
- while( '/0' != *pStr2 ) //遍历str2, 如果已为1的,在temp中设为2,为2的就是两个字符串的公共元素
- {
- if( 1 == temp[ *pStr2 ] )
- temp[ *pStr2 ] = 2;
- pStr2++;
- }
- for( int i = 0; i < 256; i++ )
- {
- if( 2 == temp[i] )
- {
- delCh(str1, i); //删除str1中所有的字符i(如果有的话)
- delCh(str2, i);
- }
- }
- }
这样做的原理是用空间换时间,牺牲了256个整数的空间(可以用char temp[256]来代替),三遍并列的循环可以把两个数组的相同的元素找出来。如果用常规办法的话,估计要嵌套循环3遍~
如果是unicode嘛,可以设int temp[65536];
如果是多字节编码,这个...我也没想过~
下面看这个 void delChar(char *str, char ch);的实现。
因为要删掉所有的i,如果是常规做法,每删一个元素,后面的就要往前面移动,那就用比较多的时间了。
下面换个做法,看这个代码:
- void delChar( char *str, char ch)
- {
- char *pCurr = str; //用来处理删除后的结果
- char *pTemp = str; //用来扫描源字符串str
- while( '/0' != *pTemp )
- {
- if( ch != *pTemp )
- {
- *pCurr = *pTemp;
- pCurr++;
- }
- pTemp++;
- }
- *pCurr = '/0';
- }
这个代码的思想和常规的不同,移动过去的是不想删掉的,要删的反而不移动它。这样仅需要扫描一次就可以了。
这个样子实现,整个程序最多仅需扫描5次字符串就可以做完任务了。
还可以扩展,如果删除多个字符串的相同字符,都是这样处理,而且复杂度都是O(N)
至于还能不能简化???我现在想不出来,各位请多多指教啊,在下感激不尽,呵呵。
注:这个delChar的程序的想法是参考STL algorithm中的unique的源码得到的,特此说明。
- 删除串中相同的元素:一个做法
- 删除串中相同的元素
- 关于删除数组中相同元素的一个小技巧
- [python]删除列表中相同的元素
- 删除数组中相同的元素
- 删除字符串中相同的元素
- 删除数组中相同的元素
- 删除任意数组中相同的元素 , 删除排序后的数组中相同的元素
- 从一个链表channelHead中删除和channelToDeleteHead中相同的元素
- 根据指定的元素删除数组中相同的元素
- 删除序列中相同元素
- 删除Vector 结构体元素相同的,保留后面一个
- 编写一个函数:将一个字符串中相同的元素删除,并在main()中调⽤用,并输出.
- 删除所有相同的元素
- 删除与原数组中相同的元素
- ArrayList删除集合中某一属性相同的元素
- PHP函数之删除两个数组中相同的元素
- Python 技巧(三)—— list 删除一个元素的三种做法
- moss 自定义文档库文档图标
- Visual Basic应用程序的几种打印方法
- Application和Session使用
- 经典SQL Server用户自定义函数:首字拼音查询
- Asp.net发邮件
- 删除串中相同的元素:一个做法
- asp.net投票进度条显示
- ASP.net 2.0中水晶报表迁移部署问题
- 解决了一个困惑很久的bug
- 3D Demo
- Asp.net验证码
- 固定水晶报表每页显示的行数两种方法
- ASP.NET中正则表达非JS
- javascript的函数