Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209986
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 798
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-14 14:54
文章分类

全部博文(87)

文章存档

2015年(87)

我的朋友

分类: C/C++

2015-10-19 10:14:35

例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。

思路:不可避免的是遍历第一个字符串,如果遍历一个字符,都需要去第二个字符串中查找其存不存在,那么复杂度会是O(nm),当然由于字符数有限,所以m是个常量。关于查找速度最快的当然是hash表,对于8位字符,size=2^8足矣。

关于删除字符,后面的字符要往前移,如果每删除一个就移一次,O(n^2)这复杂度实在太高,仅用快慢指针就可以搞定,这个方法非常有用,比如求解循环链表。

初始化:快慢指针指向第一个字符

循环:如果快指针指的是不需要删除的字符,将值赋给慢指针所指的值后,快慢指针同时++;如果快指针指向待删除字符,那么直接++;

终止:快指针指向'\0'

点击(此处)折叠或打开

  1. #include <iostream>

  2. #define NUMBER 256
  3. using namespace std;
  4. void Delete(char *first, char *second)
  5. {
  6.     int i;
  7.     int hashtable[NUMBER];
  8.     for(i=0; i<NUMBER; i++)
  9.         hashtable[i]=0;

  10.     char *p=second;
  11.     while(*p)
  12.     {
  13.         hashtable[*p]=1;
  14.         p++;
  15.     }

  16.     char *slow=first;
  17.     char *fast=first;
  18.     while(*fast)
  19.     {
  20.         if(hashtable[*fast]==0)
  21.         {
  22.             *slow=*fast;
  23.             slow++;
  24.         }
  25.         fast++;
  26.     }
  27.     *slow='\0';
  28. }

  29. void main()
  30. {
  31.     char first[]="They are students.";
  32.     char second[]="aeiou";
  33.     Delete(first, second);
  34.     cout<<first<<endl;

  35. }

阅读(1209) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~