【題 目】輸入兩個字串,從第乙個字串中刪除第二個字串中出現的所有字元。例如:輸入"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).好了,刪除和查詢的問題都解決了,我們很容易寫出如下的**:
// they are students.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #includeusing namespace std;
void delchars(char* pstrsource,char* pstrdel)
//hash表中儲存第二個字串中每個字元出現的次數
char *pch = pstrdel;
while(*pch != '\0')
//我自己新增的
for (int i=0;i<256;i++)
cout
char *pslow = pstrsource;
while(*pfast != '\0')
pfast++;
} //非常容易忽視,記得加上字串結束符!
*pslow = '\0';
}int main()
在字串中刪除特定字元
第一種方法 遍歷原陣列,在待刪陣列裡遍歷是否刪除該元素 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.分析 這是一道微軟面試題。在微軟的常見面試題中,與字串相關的題目佔了很大的一部分,因為寫程式操作字串能很好的反映我們的程式...