题目:
实现以下函数:输入为两个字符串指针,要求从第一个字符串中删除第二 个字符串中没有出现过的字符,并
返回第一个字符串的指针。实现函数:
char* intersectStr(char* str1, char* str2)示例:
输入: str1="Welcome CVTE" str2="KEem"输出: "emeE"
主要问题:
1、如何判断那些字符是需要删除的字符。同很多字符串问题一样,可以开辟一个哈希数组,全部初始化为false,将第二个字符串中字符对应的映射位置置为ture,表示这些位置对应的字符在第一个字符串中需要删除。
2, 如何删除实现删除字符操作,我们采用删除元素后面元素左移覆盖,相当于删除字符。具体实现我们可以定义两个指针(pFast和pSlow),初始的时候都指向第一字符的起始位置。当pFast指向的字符是需要删除的字符,则pFast直接跳过,指向下一个字符。如果pFast指向的字符是不需要删除的字符,那么把pFast指向的字符赋值给pSlow指向的字符,并且pFast和pStart同时向后移动指向下一个字符。这样,前面被pFast跳过的字符相当于被删除了。用这种方法,整个删除在O(n)时间内就可以完成。
3,char的范围在-128-127,unsigned char的范围才是在0-255,因此ASCII值在128-255之间的字符,如果保存为了char型,其转化为int值的范围是在-128--1之间,需要转化成正值下标。
根据以上思路写出的代码如下:
#define MAX 256
char* DeleteChars(char *str1, char *str2)
{
if (str1 == NULL || str2 == NULL)
return NULL;
bool hashtable[MAX];
memset(hashtable, 0, sizeof(hashtable));
while (*str2 != '\0')
{
int index;
if (*str2 >= 0)
{
index = *str2;
}
else
{
index = *str2 + 256;
}
hashtable[index] = true;
++str2;
}
char *pFast = str1;
char *pSlow = str1;
while (*pFast != '\0')
{
int index;
if (*pFast >= 0)
{
index = *pFast;
}
else
{
index = *pFast + 256;
}
if (hashtable[index])
*pSlow++ = *pFast;
pFast++;
}
*pSlow = '\0';
return str1;
}
int main()
{
char str1[] = "Welcome CVTE ";
char str2[] = "KEem";
char* str=DeleteChars(str1, str2);
cout<<str;
return 0;
}