删除串中相同的元素
来源:互联网 发布:太原老兵知豆电话 编辑:程序博客网 时间:2024/06/08 01:32
有一个问题,如何删除两个字符串相同的字符,比如
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]删除列表中相同的元素
- 删除数组中相同的元素
- 删除字符串中相同的元素
- 删除数组中相同的元素
- 删除任意数组中相同的元素 , 删除排序后的数组中相同的元素
- 根据指定的元素删除数组中相同的元素
- 删除序列中相同元素
- 删除所有相同的元素
- 删除与原数组中相同的元素
- ArrayList删除集合中某一属性相同的元素
- 关于删除数组中相同元素的一个小技巧
- PHP函数之删除两个数组中相同的元素
- vector数组中删除相同元素(输入的元素输出时只能出现一次)
- 链表的相同元素删除
- 删除两个容器内相同的元素
- 顺序表删除相同的元素
- asp.net profile
- @import与link的具体区别
- Java读取Properties文件的六种方法
- USB设备加载
- 正则表达式30分钟入门教程
- 删除串中相同的元素
- Tomcat的服务器配置文件server.xml解析
- ASP.NET 实现统计在线人数
- 解决Linux下Opera字体混乱问题
- android开发包下载
- VB6.0的问题
- 能否做到心平气和的工作吗?(回复)
- 选项卡
- java的import、package、文件命名规则