題目:輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入
」they are students.」
和」aeiou」
,則刪除之後的第乙個字串變成
」thy r stdnts.」。
最簡單的方法當然是,對於str1中的每個字母,去str2中掃瞄一遍,如果沒有那麼就把str1中當前位置之後的所有字母都往前移動乙個位置.以此類推,複雜度為o(n*n);
首先我們可以利用雜湊的思想,免去在str2中掃瞄的時間。而是利用str2去初始化乙個hash[256]的陣列,如果str2中有某個字母,那麼這麼字母的ascii碼對應的陣列元素就置為1.所以我們在str1中確定當前字母是否在str2中存在的時候,只需要判斷hash[*p] == 1與否。
接下來想辦法減少在str1中移動當前位置後面元素的時間。
網上的思路:
事實上,我們並不需要在每次刪除乙個字元的時候都去移動後面所有的字元。我們可以設想,當乙個字元需要被刪除的時候,我們把它所佔的位置讓它後面的字元來填補,也就相當於這個字元被刪除了。在具體實現中,我們可以定義兩個指標
(pfast
和pslow)
,初始的時候都指向第一字元的起始位置。當
pfast
指向的字元是需要刪除的字元,則
pfast
直接跳過,指向下乙個字元。如果
pfast
指向的字元是不需要刪除的字元,那麼把
pfast
指向的字元賦值給
pslow
指向的字元,並且
pfast
和pstart
同時向後移動指向下乙個字元。這樣,前面被
pfast
跳過的字元相當於被刪除了。用這種方法,整個刪除在
o(n)
時間內就可以完成。
形象一點的表述:
假如2個要用磚頭鋪一條從a到b的路(對應str1),從a到b的路上散布著很多磚頭,但是,有的是完整的,有的是碎的(對應str2中的元素)。
那麼安排2個人a(slow指標)負責砌磚,b(fast指標)負責提供磚頭。所以想鋪一條由完整的磚頭組成的路,b從a到b走,遇到碎磚就跳過去,遇到整磚,就傳遞給負責鋪路的.直到b已經走到b,表示路上的整磚已經用完了。此時a也把所有的完整的磚頭用來鋪路了。
#include "stdafx.h"
#include#include#include#includeusing namespace std;
int hashtable[256];
void inittable(char *substr)
p = null;
}char *delete(char *source, char *substr)
fast++;
} *slow = '\0';
return source;
}int main()
{ int n = 20;
char *source = (char *)malloc(sizeof(char)*n);
char *substr = (char *)malloc(sizeof(char)*n);
cout<<"source string : ";
cin>>source;//輸入連續字串,不要有空格
//cout<>substr;//輸入連續字串,不要有空格
inittable(substr);//初始化table陣列
cout<
java獲取乙個字串在另乙個字串中出現的次數
獲取乙個字串在另乙個字串中出現的次數。abkkcdkkefkkskk 思路 1,定義個計數器。2,獲取kk第一次出現的位置。3,從第一次出現位置後剩餘的字串中繼續獲取kk出現的位置。每獲取一次就計數一次。4,當獲取不到時,計數完成。class stringtest2 return count 練習三...
Java統計乙個字串在另乙個字串中出現的次數
1.鍵盤錄入乙個大字串,再錄入乙個小字串 2.統計小字串在大字串中出現的次數 3.執行列印格式 請輸入大字串 woaichina,chinabutongyubaima,wulunchinahaishijpan,zhaodaogongzuojiushihaoma 請輸入小字串 china 控制台輸出 ...
判斷乙個字串是否在另乙個字串中
方法一 string str1 nihaoksdoksad string str2 ok int total 0 for string tmp str1 tmp null tmp.length str2.length tmp tmp.substring 1 system.out.println st...