0001 刪除字串中的公共字元

2021-10-05 13:14:12 字數 1429 閱讀 2521

題目: 輸入兩個字串, 從第一字串(下文稱為x)中刪除第二個字串(下文簡稱為y)中所有的字元. 例如, 輸入they are students.aeiou, 則刪除之後的第乙個字串變成thy r stdnts.

最簡單的思路

兩層迴圈遍歷, 每遍歷到字串 y 中的乙個字元, 就在字串 x 中找到相同的字元, 找到之後刪除它,並將字串 x 後面的字元整體向前移動1位。所以這個過程的時間複雜度是o(n³).

優化 - 解決順序儲存結構中刪除後整體移動的問題

刪除乙個字元的另乙個思路是:不是某個指定的字元就保留, 按照這種思維方式, 可以將需要保留的字元覆蓋在原來的字串上, 此時需要兩個標記變數(或者說指標), 乙個用於控制字串 x 的整體遍歷過程,乙個記錄要覆蓋的位置, 這樣的話,我們就能避免每一次刪除後的整體平移,時間複雜度優化為o(n²), 如下圖所示.

優化 - 引入hash表, 避免雙層遍歷

o(n²)的時間複雜度是由遍歷兩個字串產生的,引入hash表能夠避免迴圈巢狀的問題,我採用的方式是對字串 y, 建立乙個hash表, 在字串 y **現的字元, 在hash表中的值為1, 反之為0.

參考標點符號和字母的ascii碼值, hash範圍選成256就足夠了.

關於選用hash表的方式: 用乙個o(256)的空間複雜度,將時間複雜度從o(n^2)將為o(n),如果n很大的話,這個替換是值得的。

show the code
#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;

// 遍歷字串y

while

(*p2 !=

'\0'

)// 遍歷字串x

while

(*p1 !=

'\0'

) p1++;}

arr1[index]

='\0'

;}

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

題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 they are students.和 aeiou 則刪除之後的第乙個字串變成 thy r stdnts.解題思路 好未來那這道題做過筆試題目,首先最簡單的思路就是兩層迴圈遍歷,下面將 they are students.稱為字...

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

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

字串 如何刪除字串中重複的字元

刪除字串中重複的字元,例如,good 去掉重複的字串後就變成 god 第一種方法 蠻力法 最簡單的方法就是把這個字串看作是乙個字元陣列,對該陣列使用雙重迴圈進行遍歷,如果發現有重複的字元,就把該字元置為 0 最後再把這個字元陣列中所有的 0 去掉,此時得到的字串就是刪除重複字元後的目標字串。第二種方...