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

2022-07-05 17:06:13 字數 2813 閱讀 1057

面試中經常會考到演算法,下面分別講如何刪除乙個字串裡的特定字元或特定字串

一、題目:輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。

例如, 輸入」i want to be a excellent programmers」和」aem」,則刪除之後的第乙個字串變成」i wnt to b  xcllnt progrrs"

分析:要程式設計完成這道題要求的功能可能並不難。畢竟,這道題的基本思路就是在第一 個字串中拿到乙個字元,在第二個字串中查詢一下,看它是不是在第二個字串中。如果在的話,就從第乙個字串中刪除。但如何能夠把效率優化到讓人 滿意的程度,卻也不是一件容易的事情。也就是說,如何在第乙個字串中刪除 乙個字元,以及如何在第二字串中查詢乙個字元,都是需要一些小技巧的。

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

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

接下來我們考慮如何在乙個字串中查詢乙個字元。當然,最簡單的辦法就是從 頭到尾掃瞄整個字串。顯然,這種方法需要乙個迴圈,對於乙個長度為 n 的字 符串,時間複雜度是 o(n)。 由於字元的總數是有限的。對於八位的 char 型字元而言,總共只有 28=256 個字 符。我們可以新建乙個大小為 256 的陣列,把所有元素都初始化為 0。然後對於 字串中每乙個字元,把它的 ascii 碼對映成索引,把陣列中該索引對應的元素 設為1。這個時候,要查詢乙個字元就變得很快了:根據這個字元的 ascii 碼, 在陣列中對應的下標找到該元素,如果為 0,表示字串中沒有該字元,否則字串中包含該字元。此時,查詢乙個字元的時間複雜度是 o(1)。其實,這個陣列 就是乙個 hash 表。

基於上述分析,我們可以寫出如下**:

1

#define _crt_secure_no_warnings

2 #include 3 #include 4

5char * deletestr(char *source, char *key)

617 point_sou =source;

18 point_key =source;

19while (*point_sou != '\0'

)2026 point_sou++; //

是待刪除字元,sou指標繼續向前移,key指標停留在待刪除字元前

27//

下一次迴圈判斷是不是待刪除字元,不是,將sou指標指向的字元賦給key指標指向的字元,souce也就相當於刪除了前面的字元

2829

}30 *point_key = '\0'

;31return

source;

3233}34

35int

main()

36

二、問題描述: 在給定字串中查詢所有特定子串並刪除,如果沒有找到相應子串,則不作任何操作。

要求實現函式:int delete_sub_str(const char *str, const char *sub_str, char *result_str)

【輸入】

str:輸入的被操作字串  

sub_str:需要查詢並刪除的特定子字串

【輸出】

result_str:在str字串中刪除所有sub_str子字串後的結果

【返回】

刪除的子字串的個數

1

#define _crt_secure_no_warnings

2 #include 3 #include 456

int mysubstring(char* str_in, char* str_sub, char*str_out)724

25if (str_sub[j] != '

\0') /*

如果不是子串

*/26

29else

/*如果是子串

*/3034}

3536

return

count;37}

3839

40int

main()41;

4546

int count =mysubstring(str_in, str_sub, str_out);

4748 printf("

子串:%s\n

", str_sub);

49 printf("

個數:%d\n

", count);

50 printf("

原串:%s\n

", str_in);

51 printf("

結果:%s\n

", str_out);

5253

return0;

5455 }

在字串中刪除特定字元

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

在字串中刪除特定的字元(字串)。

題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 they are students.和 aeiou 則刪除之後的第乙個字串變成 thy r stdnts.其實這類題有個特點,字串中的字元分為兩類,就可以聯想快速排序裡的將當前的陣列分為左右兩組,其中左邊的數字小於某值,右邊的數...

在字串中刪除特定的字元

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