字串相同怎麼快速刪除kmp演算法初認識

2021-09-27 07:06:00 字數 1161 閱讀 5411

輸入2個字串s1和s2,要求刪除字串s1**現的所有子串s2,即結果字串中不能包含s2。

輸入格式:

輸入在2行中分別給出不超過80個字元長度的、以回車結束的2個非空字串,對應s1和s2。

輸出格式:

在一行中輸出刪除字串s1**現的所有子串s2後的結果字串。

輸入樣例:

tomcat is a male ccatat

cat輸出樣例:

tom is a male

kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱kmp演算法)。kmp演算法的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是通過乙個next()函式實現,函式本身包含了模式串的區域性匹配資訊。kmp演算法的時間複雜度o(m+n)

#include #include #include using namespace std;

void cal_next(string s,int *next) //kmp演算法中求子串next的值

if(s[k+1]==s[i])

next[i]=k;

}}void cancel(string &s1,string s2) //刪除主串s1中子串s2部分

if(s2[k+1]==s1[i])

k++;

if(k==plen-1)

}cout《這個是最簡單快捷的方法

下面我來解釋乙個比較依靠編譯環境的函式解放

#include #include #include int main()

;char s2[80]=;

int i,num;

scanf("%s",s1);

scanf("%s",s2);

//char *p=strstr(s1,s2);

while (strstr(s1,s2))

strcpy(s1+(num-cnt),p); //往前移位,即num-cnt為當前s1字串的字元個數

}num=strlen(s1);

// printf("%s\n",p);

for (i=0;i<=num;i++)

return 0;

}

KMP演算法查詢相同字串

現在有兩個字串a和b,問你在a中是否有b,有幾個?其實剛開始遇到這個問題的時候,我覺得挺簡單的呀!依次迴圈過去查詢不就可以了,當然這樣做肯 定能實現,而且程式編寫簡單粗暴,兩個迴圈就解決了。但是這種方法的 時間複雜度是o m n m是字串a的大小,n是字串b的大小,這樣時間複雜度 就太高了,我們需要...

KMP演算法 字串快速匹配

kmp演算法的實現 最近學習了資料結構中乙個重要的內容 字串.涉及到乙個重要也是難理解的演算法 kmp演算法,即字串快速匹配模式串的演算法.在這裡寫一下心得體會,以便後來者參考.在開始之前,還是先講一講樸素的字串匹配演算法 暴力搜尋.先講幾個基本概念 所謂暴力搜尋,就是從主串和模式串開頭字元開始,乙...

KMP 刪除字串中給定的字串

includeusing namespace std define nsiz 1000 int next nsiz char str1 nsiz char str2 nsiz void getnext char str,int n int i 0,j 1 next i 1 while i n els...