題目:
輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入「they are students.」和」aeiou」,則刪除之後的第乙個字串變成」thy r stdnts.」
解題思路:
好未來那這道題做過筆試題目,首先最簡單的思路就是兩層迴圈遍歷,下面將「they are students.」稱為字串1,將「aeiou」稱為字串2。每遍歷到字串2中的乙個字元,就在字串1中找到相同的字元,找到之後刪除它,並將字串1後面的字元整體向前移動1位。所以這個過程的時間複雜度是o(n^3),下面我們就可以考慮如何優化它了:
1.如何解決順序儲存結構中刪除後整體移動的問題?
假設當前遍歷到字串2中的「a」,現在遍歷字串1,要求是是「a」的話就刪除,那麼這個要求換乙個思路就是不是「a」就保留,在不申請新的空間的情況下,我們只需要把要保留的字元覆蓋字串中1原來的字元,要刪除的字元不做覆蓋,此時就需要有兩個指標,乙個在控制整體的遍歷過程,乙個記錄要插入的位置:
可以看到,在遍歷的過程中,如果沒有出現要刪除的字元的話,p1和p2一直在同步走(同步走的過程也是要覆蓋的過程,一直在用p1的指向字元覆蓋p2,只是他們指向相同,覆蓋也就沒有意義了),而出現了要刪除的字元,p2會停下來,指示p1指向的字元要覆蓋的位置,這樣的話,我們就能避免每一次刪除後的整體平移,這樣的話時間複雜度還有o(n^2)。
2.如何避免兩層遍歷的巢狀?
o(n^2)的時間複雜度是由遍歷兩個字串產生的,能否應用一些方法避免迴圈巢狀的問題,引入hash表。
兩個遍歷巢狀的過程無非是為了找到字串2中的字元在字串1中是否出現,那麼如果我們對字串1建立hash表,在遍歷字串2時就可以根據hash索引直接找到要刪除的字元,這樣的話時間複雜度就可以降到o(n),下面考慮字串2中出現重複字元的情況,無所謂啊,反正都是要刪了的。
所以我們就能對字串2建立乙個hash表了,hash函式選擇:(int)arr2[n]
。在字串2中出現的字元,在hash表中的值為1,未出現的字元錶值為0。
hash表範圍的選取:
a :97
a :65
z :122
z :90
標點符號還在字母之前,所以hash範圍選成256就足夠了。
所以總的來說,我們用乙個o(256)的空間複雜度,將時間複雜度從o(n^2)將為o(n),所以如果n很大的話,這個替換是值得的。
**實現:
#include "iostream"
using
namespace
std;
void deletechar(char arr1,char arr2);
int main()
void deletechar(char *arr1,char *arr2)
; char *p1 = arr1;
char *p2 = arr2;
int index =0;
//遍歷刪除串
while(*p2 != '\0')
//遍歷待刪除串
while (*p1 != '\0')
p1++;
}arr1[index]='\0';
}
0001 刪除字串中的公共字元
題目 輸入兩個字串,從第一字串 下文稱為x 中刪除第二個字串 下文簡稱為y 中所有的字元.例如,輸入they are students.和aeiou,則刪除之後的第乙個字串變成thy r stdnts.最簡單的思路 兩層迴圈遍歷,每遍歷到字串 y 中的乙個字元,就在字串 x 中找到相同的字元,找到之...
演算法 在字串中刪除特定的字元或字串
面試中經常會考到演算法,下面分別講如何刪除乙個字串裡的特定字元或特定字串 一 題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 i want to be a excellent programmers 和 aem 則刪除之後的第乙個字串變成 i wnt to b xcllnt ...
在字串中刪除特定的字元(字串)。
題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 they are students.和 aeiou 則刪除之後的第乙個字串變成 thy r stdnts.其實這類題有個特點,字串中的字元分為兩類,就可以聯想快速排序裡的將當前的陣列分為左右兩組,其中左邊的數字小於某值,右邊的數...