锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浼犵粺鐨勫瓧絎︿覆妯″紡鍖歸厤綆楁硶錛堜篃灝辨槸BF綆楁硶錛夊氨鏄浜庝富涓插拰妯″紡涓插弻鍙岃嚜宸﹀悜鍙籌紝涓涓竴涓瓧絎︽瘮杈冿紝濡傛灉涓嶅尮閰嶏紝涓諱覆鍜屾ā寮忎覆鐨勪綅緗寚閽堥兘瑕佸洖婧傝繖鏍風殑綆楁硶鏃墮棿澶嶆潅搴︿負O錛?font face=Times>n錛?font face=Times>m錛夛紝鍏朵腑n鍜?font face=Times>m鍒嗗埆涓轟覆s鍜屼覆t鐨勯暱搴︺?/p>
KMP 綆楁硶鏄敱Knuth錛?font face=Times>Morris鍜?font face=Times>Pratt絳変漢鍏卞悓鎻愬嚭鐨勶紝鎵浠ユ垚涓?font face=Times>Knuth錛?font face=Times>Morris錛?font face=Times>Pratt綆楁硶錛岀畝縐?font face=Times>KMP綆楁硶銆?font face=Times>KMP綆楁硶鏄瓧絎︿覆妯″紡鍖歸厤涓殑緇忓吀綆楁硶銆傚拰BF綆楁硶鐩告瘮錛?font face=Times>KMP綆楁硶鐨勪笉鍚岀偣鏄尮閰嶈繃紼嬩腑錛屼富涓茬殑浣嶇疆鎸囬拡涓嶄細鍥炴函錛岃繖鏍風殑緇撴灉浣垮緱綆楁硶鏃墮棿澶嶆潅搴﹀彧涓?font face=Times>O錛?font face=Times>n錛?font face=Times>m錛夈備笅闈㈣璇?font face=Times>KMP綆楁硶鐨勫師鐞嗐?/p>
鍋囪鎴戜滑鏈変釜妯″紡涓蹭負“abdabcde”瀛樹簬鏁扮粍t錛屾垜浠姹傜殑灝辨槸妯″紡涓茬殑next鍊鹼紝瑙佷笅琛ㄦ墍紺猴細 i 0 1 2 3 4 5 6 7 t[i] a b d a b c d e next[i] -1 0 0 0 1 2 0 0 姹傛ā寮?font face=Times>t鐨?font face=Times>next[i]錛堢О涓哄け鏁堝嚱鏁幫級鐨勫叕寮忓涓嬶細 next[i] = ( 涓婇潰鐨勫叕寮忎腑闈?font face=Times>t瀛楁瘝鍜屾暟瀛楃粍鎴愮殑涓烘暟緇勪笅鏍?font face=Times>) 搴旇濡備綍鐞嗚Вnext鏁扮粍鍛紵鍦ㄥ尮閰嶈繃紼嬩腑錛屽鏋滃嚭鐜頒笉鍖歸厤鐨勬儏鍐碉紙褰撳墠妯″紡涓蹭笉鍖歸厤瀛楃鍋囧畾涓?font face=Times>t[i]錛夛紝瀹冩墍瀵瑰簲鐨?font face=Times>next[i]鐨勬暟鍊間負鎺ヤ笅鏉ヨ鍖歸厤鐨勬ā寮忎覆鐨勫瓧絎︾殑绱㈠紩錛涗篃灝辨槸璇達紝鍑虹幇涓嶅尮閰嶇殑鎯呭喌鏃訛紝妯″紡涓茬殑绱㈠紩鎸囬拡瑕佸洖婧埌涓?font face=Times>next[i]鎵瀵瑰簲鐨勪綅緗紝鑰屼富涓茬殑绱㈠紩鎸囬拡淇濇寔涓嶅彉銆?/p>
鐗瑰埆鐨勶紝next鏁扮粍涓殑next[0]鍜?font face=Times>next[1]鐨勫彇鍊兼槸鍥哄畾鐨勶紝涓轟簡鏍囪瘑鍑洪瀛楁瘝錛岄渶瑕佸亣瀹?font face=Times>next[0]涓猴紞1錛堝彇涓猴紞1鏄冭檻鍒?font face=Times>C璇█涓殑鏁扮粍绱㈠紩浠?font face=Times>0寮濮嬶級銆傚湪瀹炵幇鐨勬椂鍊欙紝瑕佸疄鐜板叕寮忎腑鎯呭喌鐨勫鐞嗛渶瑕佷簺鎶宸э紝涓嬮潰緇欏嚭鍏蜂綋鐨勫疄鐜幫細 KMP 綆楁硶涔熸湁闇瑕佹敼榪涚殑鍦版柟銆傚浜庢ā寮忎覆“aaaadd”鍦ㄥ尮閰嶆椂錛堝亣瀹氳鍖歸厤涓蹭負“aaadddd”錛夛紝鍙互鐪嬪埌錛屽湪鍖歸厤鍒扮儲寮?font face=Times>3鏃訛紝涓諱覆瀛楃涓?#8220;d”錛屾ā寮忎覆瀛楃涓?#8220;a”錛屽鏋滄寜鐓т笂闈㈢殑鍋氭硶錛岃繖鏃舵ā寮忎覆鍙細鍥炴函涓涓儲寮曪紝鐢變簬浠嶄笉鍖歸厤錛屾ā寮忎覆榪樹細鍥炴函涓涓儲寮曪紝鐩村埌绱㈠紩浣嶇疆鍒頒簡棣栧瓧絎︼紝涓諱覆鐨勭儲寮曟寚閽堟墠浼氬墠榪涗竴浣嶏紝榪欐牱灝變細嫻垂涓浜涗笉蹇呰鐨勬瘮杈冩椂闂淬傚嚭鐜拌繖縐嶆儏鍐電殑鍘熷洜鏄ā寮忎覆涓綅緗?font face=Times>i鐨勫瓧絎︿笌next[i]瀵瑰簲鐨勫瓧絎︾浉鍚岋紝闇瑕佷慨姝?font face=Times>next[i]涓?font face=Times>next[i]瀵瑰簲鐨勫瓧絎︾殑绱㈠紩銆備笅闈㈠垪鍑?#8220;aaaadd”淇鐨?font face=Times>nextval鏁扮粍鐨勫唴瀹癸細 i 0 1 2 3 4 5 t[i] a a a a d d next[i] -1 0 1 2 3 0 nextval[i] -1 -1 -1 -1 0 0 淇鍑芥暟濡備笅錛?/p>
#include <stdlib.h>
typedef struct QString {
char * cs;
int len;
}String;
void GetNext(String s , int next []){
int len = s . len;
int i = 0 ;
int k = - 1 ;
next [ 0 ] = - 1 ;
while (i < len - 1 ){
if (k ==- 1 || s . cs[i] == s . cs[k]){
i ++ ;
k ++ ;
next [i] = k;
} else {
k = next [k];
}
}
}
int KMPIndex(String s , String m){
int next [m . len] , i = 0 , j = 0 ;
int k;
GetNext(m , next );
while (i < s . len && j < m . len){
if (j ==- 1 || s . cs[i] == m . cs[j]){
i ++ ;
j ++ ;
} else {
j = next [j];
}
}
if (j >= m . len) return i - m . len;
else return - 1 ;
}
int len = s . len , i = 0 , k = - 1 ;
nextval[ 0 ] = - 1 ;
while (i < len - 1 ){
if (k ==- 1 || s . cs[i] == s . cs[k]){
i ++ ;
k ++ ;
if (s . cs[i] != s . cs[k]){
nextval[i] = k;
} else nextval[i] = nextval[k];
} else {
k = nextval[k];
}
}
}
璋㈣阿鏌愪漢鐨勭▼搴忥細錛?br>public class CyclicExe
{
private int[] next=null;
CyclicExe()
{
}
public static void main(String[] args)
{
CyclicExe c=new CyclicExe();
StringBuffer mainString=new StringBuffer("abbabbbaaaaaccd");
StringBuffer oldString=new StringBuffer("abc");
String newString=new String("mmm");
c.initial(oldString);
int pos=0;
int index=0;
while(pos<mainString.length()){
index=c.findIndex(mainString, oldString, pos);
if(index!=0){
mainString.replace(pos, pos+oldString.length()-1, newString);
pos=pos+oldString.length();
}
}
}
void initial(StringBuffer oldString)
{
next=new int[oldString.length()];
int i=1;
next[1]=0;
int j=0;
while(i<oldString.length()){
if(j==0||oldString.charAt(i)==oldString.charAt(j)){
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int findIndex(StringBuffer mainString,StringBuffer oldString,int pos)
{
int i=pos;
int j=1;
while(i<mainString.length()&&j<oldString.length())
{
if(j==0||mainString.charAt(i)==oldString.charAt(j)) {
i++;
j++;
}
else
j=next[j];
}
if(j>oldString.length()) return i-oldString.length();
else return 0;
}
}
]]>
* f
______________
錛漡 g g g g g
闂紝a b c d e f g鍚勬槸浠涔堟暟瀛楋紙涓嶉噸澶嶏級
綆楁硶瑙g瓟錛?11111=3*7*11*13*37
鍥犱負 f!=g&&gggggg%f==0&&f<10
鎵浠?f==3||f==7
鍙﹀ abcde<111111 && abcde*f==111111*g
鎵浠?g<f
f==7鏃秅==6
f==3鏃舵棤瑙?