一、問題描述
輸入兩個字符串,從第一字符串中刪除第二個字符串中所有的字符。
例如,輸入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;
}
夢想還是要有的,萬一實現了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~