演算法20 在字串中刪除特定的字元

2021-06-28 00:03:10 字數 1607 閱讀 5638

【題  目】輸入兩個字串,從第乙個字串中刪除第二個字串中出現的所有字元。例如:輸入"they are students." 與 「aeiou」,則應該輸出「thy r stdnts.」。

【思 路1】首先我們還是以解決問題為第一要義,尋找最為直觀的解決方案,很容易想到的方法就是,對於在第乙個字串中的每乙個字元,拿它去查詢是否在第二個字串中出現過,如果是,則刪除,如果不是則保留。刪除乙個字元,要讓該字元之後的所有字元逐一向前移位,所以時間複雜度為o(n),對於長度為n的字串,總的時間複雜度為o(n2).而對於給定的字元,在第二個字串中查詢該字元,如果遍歷長度為m的第二個字串的話,時間複雜度也為o(m),總的時間複雜度為o(mn).

【思 路2】有沒有更為高效的方法呢?事實上我們在並沒有必要在每次刪除乙個字元的時候都讓後面的字元移動,我們只需要讓被刪除位置的字元被後面不需要被刪除的字元來代替就可以了,相當於我們有乙個先頭哨兵,它只負責尋找那些不需要被刪除的字元,碰到需要刪除的就直接跳過,碰到不需要刪除的就告訴主力哨兵,主力哨兵負責對於先頭哨兵找到的字元給予「接收」位置就行了。具體來說:我們可以設定兩個指標pfast(先頭哨兵)和pslow(主力哨兵),初始時兩個都指向字串的第乙個字元,pfast碰到乙個需要刪除的字元「視而不見」直接跳過;pfast如果碰到不需要刪除的字元,就把該字元複製給pslow,同時pfast後移(繼續尋找),pslow(指向下乙個位置)。這樣整個演算法的時間複雜度就可以達到o(n)。

接下來我們要考慮查詢的問題,對於char型字元的查詢,我們討論過用長度為256的雜湊表來儲存字元出現的次數最後高效,詳細討論見【演算法19】.這樣的查詢效率為o(1).好了,刪除和查詢的問題都解決了,我們很容易寫出如下的**:

1 #include2 #include

3using

namespace std;45

void delchars(char* pstrsource,char* pstrdel)

6 17

18//

hash表中儲存第二個字串中每個字元出現的次數

19char *pch = pstrdel;

20while(*pch != '

\0')

21

2526

char *pfast = pstrsource;

27char *pslow = pstrsource;

28while(*pfast != '

\0')

29

37 pfast++;

38 }

3940

//非常容易忽視,記得加上字串結束符!

41 *pslow = '

\0';

42 }

4344

int main()

45

執行結果如下:

程式設計師面試題精選100題:

注:1)本部落格所有的**環境編譯均為win7+vc6。所有**均經過博主上機除錯。

2)博主

python27

在字串中刪除特定字元

第一種方法 遍歷原陣列,在待刪陣列裡遍歷是否刪除該元素 char removechars char str,const char remove if state temp count str i state true i temp count 0 return temp 第二種方法 時間複雜度o n...

演算法 在字串中刪除特定的字元或字串

面試中經常會考到演算法,下面分別講如何刪除乙個字串裡的特定字元或特定字串 一 題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 i want to be a excellent programmers 和 aem 則刪除之後的第乙個字串變成 i wnt to b xcllnt ...

在字串中刪除特定的字元

題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 they are students.和 aeiou 則刪除之後的第乙個字串變成 thy r stdnts.分析 這是一道微軟面試題。在微軟的常見面試題中,與字串相關的題目佔了很大的一部分,因為寫程式操作字串能很好的反映我們的程式...