題目: 輸入兩個字串, 從第一字串(下文稱為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 去掉,此時得到的字串就是刪除重複字元後的目標字串。第二種方...