演算法 刪除字串中的公共字元

2021-08-06 06:21:03 字數 1833 閱讀 7515

題目:

輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入「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.其實這類題有個特點,字串中的字元分為兩類,就可以聯想快速排序裡的將當前的陣列分為左右兩組,其中左邊的數字小於某值,右邊的數...