在字串中刪除另乙個字串中出現的字元

2021-06-08 19:27:42 字數 1744 閱讀 6144

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

」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...