版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiki_tangmingwei/article/details/83280935
一、问题描述
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
例如,输入A串”They are students.”和B串”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
二、问题分析
此题分为两个部分来解答
1)查找在A串中出现的B串字符
2)删除A串中的字符
对于第1)个问题,能做到快速查找的方法是二分和哈希,这里明显用哈希更合适,考虑到是字符,因此设置它们的asc11编码作为键,将B串录入哈希表中,值为0或者1。0表示该字符没有在B串中,1表示该字符在B串中;
对于第2)个问题,考虑到每删除一个i位置上的字符,需将i+1后面的字符往前挪,这样在最差的情况下,会挪动(n-1+n-2+...+1)次,复杂度为O(n^2),因此要想一个聪明的方法来降低复杂度。
这里采用前后指针的方式。
初始状态:*pSlow和*pFast指针都指向字符串串首位置
1)当A[*pFast]在哈希表中的值为0,说明该字符没有出现在B中,可将此字符纳入新串里(新串相当于用*pSlow在原串中做覆盖):A[*pSlow]=A[*pFast]; pSlow++ && pFast++
2)当A[*pFast]在哈希表中的值为1,说明该字符出现在B中,则跳过此值:pFast++
3)当pFast走到串尾的时候,新串(覆盖串)记得加'\0',*pSlow = '\0'
三、解题算法
/*******************************
author:tmw
date:2018-10-22
*******************************/
#include <stdio.h>
#include <stdlib.h>
char* deleAllElemInStrB(char* A, char* B)
{
if(A == NULL || B == NULL) return NULL;
/**建立长度为256的哈希表,并做初始化**/
int* hash_table = (int*)malloc(256*sizeof(int));
int i;
for(i=0; i<256; i++)
hash_table[i] = 0;
/**将B表元素存入hash表中**/
char* temp = B;
while(*temp != '\0')
{
hash_table[(int)(*temp)] = 1;
temp++;
}
//定义俩指针,初始状态都指向串首
char* pSlow = A;
char* pFast = A;
while(*pFast != '\0')
{
/**如果*pFast指向的元素不在哈希表中,则纳入新的覆盖串**/
if(hash_table[(int)(*pFast)] != 1)
{
*pSlow = *pFast;
pSlow++;
pFast++;
}
else
pFast++;
}
/**记得新覆盖串补上结束标记符**/
*pSlow = '\0';
return A;
}
四、浅显的写法
bool char_in_str(char* str, int index, char* refer_str)
{
int i = 0;
for(i=0; i<strlen(refer_str); i++)
{
if(refer_str[i]==str[index])
return true;
}
return false;
}
char* update_str(char* str, char* refer_str)
{
if(str==NULL || refer_str==NULL)
return NULL;
int fast = 0;
int slow = 0;
while( str[fast] != '\0')
{
if(char_in_str(str,fast,refer_str)==false)
{
str[slow] = str[fast];
slow++; fast++;
}
else
fast++;
}
str[slow] = '\0';
return str;
}
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~