輸入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...