字串刪除問題

2021-08-23 15:50:00 字數 1175 閱讀 5880

去trend筆試也是這個題目。不過比這個簡單。。不過這個題目以前看過了,沒仔細看,筆試的時候自己把之給想出來了。

輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 」they are students.」 和 」aeiou」 ,則刪除之後的第乙個字串變成 」thy r stdnts.」

乙個字串中刪除。但如何能夠把效率優化到讓人滿意的程度,卻也不是一件容易的事情。也就是說,如何在第乙個字串中刪除乙個字 符,以及如何在第二字串中查詢乙個字元,都是需要一些小技巧的。

首先我們考慮如何在字串中刪除乙個字元。由於字串的記憶體分配方式是連續分配的。我們從字串當中刪除乙個字元,需要把後面所有的字元往前移動乙個位元組 的位置。但如果每次刪除都需要移動字串後面的字元的話,對於乙個長度為 n 的字串而言,刪除乙個字元的時間複雜度為 o(n) 。而對於本題而言,有可能要 刪除的字元的個數是 n ,因此該方法就刪除而言的時間複雜度為 o(n2) 。

事實上,我們並不需要在每次刪除乙個字元的時候都去移動後面所有的字元。我們可以設想,當乙個字元需要被刪除的時候,我們把它所佔的位置讓它後面的字元來 填補,也就相當於這個字元被刪除了。在具體實現中,我們可以定義兩個指標 (pfast 和 pslow) ,初始的時候都指向第一字元的起始位置。當 pfast 指向的字元是需要刪除的字元,則 pfast 直接跳過,指向下乙個字元。如果 pfast 指向的字元是不需要刪除的字元,那麼把 pfast 指向的字元賦值給 pslow 指向的字元,並且 pfast 和 pstart 同時向後移動指向下乙個字元。這樣,前面被 pfast 跳過的字元相當於被刪除了。用這種方法,整個刪 除在 o(n) 時間內就可以完成。

接下來我們考慮如何在乙個字串中查詢乙個字元。當然,最簡單的辦法就是從頭到尾掃瞄整個字串。顯然,這種方法需要乙個迴圈,對於乙個長度為 n 的字串,時間複雜度是 o(n) 。

由於字元的總數是有限的。對於八位的 char 型字元而言,總共只有 28=256 個字元。我們可以新建乙個大小為 256 的陣列,把所有元素都初始化為 0 。然 後對於字串中每乙個字元,把它的 ascii 碼對映成索引,把陣列中該索引對應的元素設為1。這個時候,要查詢乙個字元就變得很快了:根據這個字元的 ascii 碼,在陣列中對應的下標找到該元素,如果為 0 ,表示字串中沒有該字元,否則字串中包含該字元。此時,查詢乙個字元的時間複雜度是 o(1) 。 其實,這個陣列就是乙個 hash 表。

字串刪除

description 定義mystring類,包括 乙個字元陣列或字元指標,用於儲存字串內容。void input 讀取乙個不含空白符的字串。void output 輸出一行字串。void del char str 從當前字串中刪除str中的所有字元。input 兩個不含空白符的字串,每個佔一行。...

字串刪除

輸入兩個字串,從第乙個字串中刪除第二個字串中的所有字元,不可以使用replace 例如 輸入 they are students 和 aeiou 則刪除之後的第乙個字串變成 they r stdnts var str1 they are students str2 aeiou res 思路 判斷乙個...

移動字串和字串刪除

兩個小題目。乙個是 字串裡面只有字母和星號,要求把星號移動最左邊,字母移動到最右邊,要求複雜度盡可能低。比如 a b c d 移動之後成為 abcd 這個題目有兩個方法,首先就是暴力解法。從串尾或者串首判斷 假設串尾 如果是星號則移動到串首起第乙個不是星號的位置,然後把從那個位置開始的串統統後移一位...