4.2 堪議協海乏會贋刈式児云塰麻
咀葎堪頁方象圷殆窃侏葎忖憲侏議?來燕?侭參?來燕議贋刈圭塀挽癖喘噐堪?匆咀葎忖憲議蒙歩來才忖憲堪将械恬葎匯倖屁悶栖侃尖議蒙泣?堪壓贋刈扮珊嗤匯乂嚥匯違?來燕音揖岻侃。
窃貌噐乏會燕?喘匯怏仇峽銭偬議贋刈汽圷贋刈堪峙嶄議忖憲會双?侭僚協海頁峺梓圓協吶議寄弌?葎耽匯倖堪延楚蛍塘匯倖耕協海業議贋刈曝?泌?
#define MAXSIZE 256
char s[MAXSIZE];
夸堪議恷寄海業音嬬階狛256。
泌採炎紛糞縞海業?
1. 窃貌乏會燕?喘匯倖峺寞栖峺?恷朔匯倖忖憲?宸劔燕幣議堪宙峰泌和?
typedef struct
{ char data[MAXSIZE];
int curlen;
} SeqString;
協吶匯倖堪延楚?SeqString s。宸嶽贋刈圭塀辛參岷俊誼欺堪議海業?s.curlen+1。泌夕4.1 侭幣。 2. 壓堪硫贋刈匯倖音氏壓堪嶄竃孖議蒙歩忖憲恬葎堪議嶮潤憲?參緩燕幣堪議潤硫。曳泌C 囂冱嶄侃尖協海堪議圭隈祥頁宸劔議?万頁喘’0円’栖燕幣堪議潤崩。宸嶽贋刈圭隈音嬬岷俊誼欺堪議海業?頁喘登僅輝念忖憲頁倦頁’0円’栖鳩協堪頁倦潤崩?貫遇箔誼堪議海業。 3. 譜協海堪贋刈腎寂?char s[MAXSIZE+1]; 喘s[0]贋慧堪議糞縞海業?堪峙贋慧壓s[1]~s[MAXSIZE]?忖憲議會催才贋刈了崔匯崑?哘喘厚葎圭宴。
云弌准麼勣網胎協海堪選俊、箔徨堪、堪曳熟麻隈?乏會堪議峨秘才評茅吉塰麻児云嚥乏會燕屢揖?壓緩音壓弩峰。堪協了壓和匯弌准網胎?譜堪潤崩喘?0円?栖炎紛。
1?堪選俊?委曾倖堪s1 才s2 遍硫銭俊撹匯倖仟堪s ?軸?s<=s1+s2。
int StrConcat1(s1,s2,s)
char s1[],s2[],s[];
{ int i=0 , j, len1, len2;
len1= StrLength(s1); len2= StrLength(s2)
if (len1+ len2>MAXSIZE-1) return 0 ; /* s 海業音校*/
j=0;
while(s1[j]!=’0円’) { s[i]=s1[j];i++; j++; }
j=0;
while(s2[j]!=’0円’) { s[i]=s2[j];i++; j++; }
s[i]=’0円’; return 1;
}
麻隈4.1
2?箔徨堪
int StrSub (char *t, char *s, int i, int len)
/* 喘t 卦指堪s 嶄及倖i 忖憲蝕兵議海業葎len 議徨堪1≤i≤堪海*/
{ int slen;
slen=StrLength(s);
if ( i<1 || i>slen || len<0 || len>slen-i+1)
{ printf(?歌方音斤?); return 0; }
for (j=0; j<len; j++)
t[j]=s[i+j-1];
t[j]=’0円’;
return 1;
}
麻隈4.2
3?堪曳熟
int StrComp(char *s1, char *s2)
{ int i=0;
while (s1[i]==s2[i] && s1[i]!=’0円’) i++;
return (s1[i]-s2[i]);
}
麻隈4.3
堪議庁塀謄塘軸徨堪協了頁匯嶽嶷勣議堪塰麻。譜s 才t 頁公協議曾倖堪?壓麼堪s嶄孀欺吉噐徨堪t 議狛殻各葎庁塀謄塘?泌惚壓s 嶄孀欺吉噐t 議徨堪?夸各謄塘撹孔?痕方卦指t 壓s 嶄議遍肝竃孖議贋刈了崔(賜會催)?倦夸謄塘払移?卦指-1。t 匆各葎庁塀。葎阻塰麻圭宴?譜忖憲堪議海業贋慧壓0 催汽圷?堪峙貫1 催汽圷贋慧?宸劔忖憲會催嚥贋刈了崔匯崑。
1?酒汽議庁塀謄塘麻隈
麻隈房?泌和?遍枠繍s1 嚥t1 序佩曳熟?飛音揖?祥繍s2 嚥t1 序佩曳熟?...?岷欺s議蝶匯倖忖憲si 才t1 屢揖?壅繍万断岻朔議忖憲序佩曳熟?飛匆屢揖?夸泌緩写偬吏和曳熟?輝s 議蝶匯倖忖憲si 嚥t 議忖憲tj 音揖扮?夸s 卦指欺云緬蝕兵忖憲議和匯倖忖憲?軸si-j+2?t 卦指欺t1?写偬蝕兵和匯緬議曳熟?嶷鹸貧峰狛殻。飛t 嶄議忖憲畠何曳頼?夸傍苧云緬謄塘撹孔?云緬議軟兵了崔頁i-j+1 賜i-t[0]?倦夸?謄塘払移。譜麼堪s=?ababcabcacbab??庁塀t=?abcac??謄塘狛殻泌夕4.3 侭幣。 卆象宸倖房??麻隈宙峰泌和:
int StrIndex_BF (char *s,char *t)
/*貫堪s 議及匯倖忖憲蝕兵孀遍肝嚥堪t 屢吉議徨堪*/
{ int i=1,j=1;
while (i<=s[0] && j<=t[0] ) /*脅短囑欺潤崩憲*/
if (s[i]==t[j])
{ i++;j++; } /*写偬*/
else
{i=i-j+2; j=1; } /*指翻*/
if (j>t[0]) return (i-t[0]); /*謄塘撹孔?卦指贋刈了崔*/
else return –1;
}
麻隈4.4
乎麻隈酒各葎BF 麻隈。和中蛍裂万議扮寂鹸墫業?譜堪s 海業葎n?堪t 海業葎m。謄塘撹孔議秤趨和?深打曾嶽自極秤趨?壓恷挫秤趨和?耽緬音撹孔議謄塘脅窟伏壓及匯斤忖憲曳熟扮?
箭泌?s=?aaaaaaaaaabc?
t=?bc?
譜謄塘撹孔窟伏壓si 侃?夸忖憲曳熟肝方壓念中i-1 緬謄塘嶄慌曳熟阻i-1 肝?及i 緬撹孔議謄塘慌曳熟阻m 肝?侭參悳慌曳熟阻i-1+m 肝?侭嗤謄塘撹孔議辛嬬慌嗤n-m+1嶽?譜貫si 蝕兵嚥t 堪謄塘撹孔議古楕葎pi?壓吉古楕秤趨和pi=1/(n-m+1)?咀緩恷挫秤趨和峠譲曳熟議肝方頁? 軸恷挫秤趨和議扮寂鹸墫業頁O(n+m)。壓恷撒秤趨和?耽緬音撹孔議謄塘脅窟伏壓t 議恷朔匯倖忖憲?
箭泌?s=?aaaaaaaaaaab?
t=?aaab?
譜謄塘撹孔窟伏壓si 侃?夸壓念中i-1 緬謄塘嶄慌曳熟阻(i-1)*m 肝?及i 緬撹孔議謄塘慌曳熟阻m 肝?侭參悳慌曳熟阻i*m 肝?咀緩恷撒挫秤趨和峠譲曳熟議肝方頁? 軸恷撒秤趨和議扮寂鹸墫業頁O(n*m)。
貧峰麻隈嶄謄塘頁貫s 堪議及匯倖忖憲蝕兵議?嗤扮麻隈勣箔貫峺協了崔蝕兵?宸扮麻隈議歌方燕嶄勣紗匯倖了崔歌方pos?StrIndex(shar *s,int pos,char *t)?曳熟議兜兵了崔協了壓pos 侃。麻隈4.4 頁pos=1 議秤趨。
2?個序朔議庁塀謄塘麻隈
BF 麻隈酒汽徽丼楕熟詰?匯嶽斤BF 麻隈恂阻載寄個序議庁塀謄塘麻隈頁針適蒙(Knuth)?暢戦帽(Morris)才噸性蒙(Pratt)揖扮譜柴議?酒各KMP 麻隈。
(1) KMP 麻隈議房?
蛍裂麻隈4.4 議峇佩狛殻, 夛撹BF 麻隈堀業蛸議圻咀頁指翻?軸壓蝶緬議謄塘狛殻払移朔?斤噐s 堪勣指欺云緬蝕兵忖憲議和匯倖忖憲?t 堪勣指欺及匯倖忖憲。遇宸乂指翻旺音頁駅勣議。泌夕4.3 侭幣議謄塘狛殻?壓及眉緬謄塘狛殻嶄?s3 ~ s6 才t1~ t4 頁謄塘撹孔議?s7≠t5 謄塘払移?咀緩嗤阻及膨緬?凪糞宸匯緬頁音駅勣議?喇夕辛心竃?咀葎壓及眉緬嶄嗤s4=t2?遇t 1≠t2?刃協嗤t1≠s4 。揖尖及励緬匆頁短嗤駅勣議?侭參貫及眉緬岻朔辛參岷俊欺及鎗緬?序匯化蛍裂及鎗緬嶄議及匯斤忖憲s 6 才t1 議曳熟匆頁謹噫議?咀葎及眉緬嶄厮将曳狛阻s6 才t4?旺拝s6=t4?遇t 1=t4?駅嗤s 6=t1?咀緩及鎗緬議曳熟辛參貫及屈斤忖憲s7 才t2 蝕兵序佩?宸祥頁傍?及眉緬謄塘払移朔?峺寞i 音強?遇頁繍庁塀堪t?嘔“錆強”?喘t2 “斤彈” s 7 写偬序佩?卆緩窃容。宸劔議侃尖圭隈峺寞i 頁涙指翻議。
忝貧侭峰?錬李蝶緬壓si 才tj 謄塘払移朔?峺寞i 音指翻?庁塀t ?嘔“錆強”崛蝶倖了崔貧?聞誼tk 斤彈s i 写偬?嘔序佩。?堡撮o嶬變別盖長惻軀粘?t“錆強”欺陳倖了崔貧?音形譜了崔葎k?軸si 才tj 謄塘払移朔?峺寞i 音強?庁塀t ?嘔“錆強”?聞tk 才si斤彈写偬?嘔序佩曳熟?勣諾怎宸匯邪譜?祥勣嗤泌和購狼撹羨?
潤胎?蝶緬壓si 才tj 謄塘払移朔?泌惚庁塀堪嶄嗤諾怎購狼(4)議徨堪贋壓?軸?庁塀嶄議念k-1 倖忖憲嚥庁塀嶄tj 忖憲念中議k-1 倖忖憲屢吉扮?庁塀t 祥辛參?嘔“錆強”崛聞tk 才si 斤彈?写偬?嘔序佩曳熟軸辛。
?2?next 痕方
庁塀嶄議耽匯倖tj 脅斤哘匯倖k 峙?喇(4.4)塀辛岑?宸倖k 峙叙卆正嚥庁塀t 云附忖憲會双議更撹?遇嚥麼堪s 涙購。厘断喘next[j]燕幣tj 斤哘議k 峙?功象參貧蛍裂?next痕方嗤泌和來嵎?
? next[j]頁匯倖屁方?拝0≤next[j]<j
? 葎阻聞t 議嘔卞音卿払販採謄塘撹孔議辛嬬?輝贋壓謹倖諾怎(4.4)塀議k 峙扮?哘函恷寄議?宸劔?嘔“錆強”議鉦宣恷玉?“錆強”議忖憲葎j-next[j]倖。
? 泌惚壓tj 念音贋壓諾怎(4.4)塀議徨堪?緩扮飛t1≠tj?夸k=1; 飛t1=tj?夸k=0; 宸扮“錆強”議恷垓?葎j-1 倖忖憲軸喘t1 才sj+1 写偬曳熟。
咀緩?next 痕方協吶泌和?
(3) KMP 麻隈
壓箔誼庁塀議next 痕方岻朔?謄塘辛泌和序佩?邪譜參峺寞i 才j 蛍艶峺幣麼堪才庁塀嶄議曳熟忖憲?綜i 議兜峙葎pos?j 議兜峙葎1。飛壓謄塘狛殻嶄si≠tj?夸i 才j 蛍艶奐1?飛si≠tj 謄塘払移朔?夸i 音延?j 曜欺next[j]了崔壅曳熟?飛屢吉?夸峺寞光徭奐1?倦夸j 壅曜欺和匯倖next 峙議了崔?卆緩窃容。岷崛和双曾嶽秤趨?匯嶽頁j 曜欺蝶倖next峙扮忖憲曳熟屢吉?夸i 才j 蛍艶奐1写偬序佩謄塘; 総匯嶽頁j 曜欺峙葎巣?軸庁塀議及匯倖忖憲払塘??夸緩扮i 才j 匆勣蛍艶奐1?燕苧貫麼堪議和匯倖忖憲軟才庁塀嶷仟蝕兵謄塘。
譜麼堪s=?acabaabaabcacaabc??徨堪t=?abaabcac??夕4.4 頁匯倖旋喘next 痕方序佩謄塘議狛殻幣吭夕。壓邪譜厮嗤next 痕方秤趨和?KMP 麻隈泌和?
int StrIndex_KMP(char *s,char *t,int pos)
/*貫堪s 議及pos 倖忖憲蝕兵孀遍肝嚥堪t 屢吉議徨堪*/
{ int i=pos,j=1,slen,tlen;
while (i<=s[0] && j<=t[0] ) /*脅短囑欺潤崩憲*/
if (j==0||s[i]==t[j]) { i++; j++; }
else j=next[j]; /*指翻*/
if (j>t[0]) return i-t[0]; /*謄塘撹孔?卦指贋刈了崔*/
else return –1;
}
麻隈4.5
(4)泌採箔next 痕方
喇參貧網胎岑?next 痕方峙叙函畳噐庁塀云附遇才麼堪涙購。厘断辛參貫蛍裂next 痕方議協吶竃窟喘弓容議圭隈箔誼next 痕方峙。喇協吶岑?
next[1]=0 (4.5)
譜next[j]=k?軸嗤?
及匯嶽秤趨?飛tk ?tj 夸燕苧壓庁塀堪嶄
咀緩? next[j+1]=next[k]+1 (4.11)
揖尖飛t k′ ≠tj?夸繍庁塀写偬?嘔錆強崛聞及next[k′]倖忖憲才tj 斤馴?卆緩窃容?岷崛tj 才庁塀嶄議蝶倖忖憲謄塘撹孔賜宀音贋壓販採k′(1< k′<k <…<j)諾怎(4.10)?緩扮飛t1≠tj+1 ? 夸嗤?next[j+1]=1 (4.12)
倦夸飛t1=tj+1 ?夸嗤?next[j+1]=0 (4.13)
忝貧侭峰?箔next 痕方峙狛殻議麻隈泌和?
void GetNext(char *t,int next[ ])
/*箔庁塀t 議next 峙旺雁秘next 方怏嶄*/
? int i=1,j=0;
next[1]=0;
while (i<t[0])
{ while (j>0&&t[i]!=t[j]) j=next[j];
i++; j++;
if (t[i]==t[j]) next[i]=next[j];
else next[i]=j;
}
}
麻隈4.6
麻隈4.6 議扮寂鹸墫業頁O(m)?侭參麻隈4.5 議扮寂鹸墫業頁O(n*m)?徽壓匯違秤趨和?糞縞議峇佩扮寂頁O(n+m)。輝隼KMP 麻隈才酒汽議庁塀謄塘麻隈屢曳?奐紗阻載寄佃業?厘断麼勣僥楼乎麻隈議譜柴室派。
4.2.1 堪議協海乏會贋刈
窃貌噐乏會燕?喘匯怏仇峽銭偬議贋刈汽圷贋刈堪峙嶄議忖憲會双?侭僚協海頁峺梓圓協吶議寄弌?葎耽匯倖堪延楚蛍塘匯倖耕協海業議贋刈曝?泌?
#define MAXSIZE 256
char s[MAXSIZE];
夸堪議恷寄海業音嬬階狛256。
泌採炎紛糞縞海業?
1. 窃貌乏會燕?喘匯倖峺寞栖峺?恷朔匯倖忖憲?宸劔燕幣議堪宙峰泌和?
typedef struct
{ char data[MAXSIZE];
int curlen;
} SeqString;
協吶匯倖堪延楚?SeqString s。宸嶽贋刈圭塀辛參岷俊誼欺堪議海業?s.curlen+1。泌夕4.1 侭幣。 2. 壓堪硫贋刈匯倖音氏壓堪嶄竃孖議蒙歩忖憲恬葎堪議嶮潤憲?參緩燕幣堪議潤硫。曳泌C 囂冱嶄侃尖協海堪議圭隈祥頁宸劔議?万頁喘’0円’栖燕幣堪議潤崩。宸嶽贋刈圭隈音嬬岷俊誼欺堪議海業?頁喘登僅輝念忖憲頁倦頁’0円’栖鳩協堪頁倦潤崩?貫遇箔誼堪議海業。 3. 譜協海堪贋刈腎寂?char s[MAXSIZE+1]; 喘s[0]贋慧堪議糞縞海業?堪峙贋慧壓s[1]~s[MAXSIZE]?忖憲議會催才贋刈了崔匯崑?哘喘厚葎圭宴。
4.2.2 協海乏會堪議児云塰麻
云弌准麼勣網胎協海堪選俊、箔徨堪、堪曳熟麻隈?乏會堪議峨秘才評茅吉塰麻児云嚥乏會燕屢揖?壓緩音壓弩峰。堪協了壓和匯弌准網胎?譜堪潤崩喘?0円?栖炎紛。
1?堪選俊?委曾倖堪s1 才s2 遍硫銭俊撹匯倖仟堪s ?軸?s<=s1+s2。
int StrConcat1(s1,s2,s)
char s1[],s2[],s[];
{ int i=0 , j, len1, len2;
len1= StrLength(s1); len2= StrLength(s2)
if (len1+ len2>MAXSIZE-1) return 0 ; /* s 海業音校*/
j=0;
while(s1[j]!=’0円’) { s[i]=s1[j];i++; j++; }
j=0;
while(s2[j]!=’0円’) { s[i]=s2[j];i++; j++; }
s[i]=’0円’; return 1;
}
麻隈4.1
2?箔徨堪
int StrSub (char *t, char *s, int i, int len)
/* 喘t 卦指堪s 嶄及倖i 忖憲蝕兵議海業葎len 議徨堪1≤i≤堪海*/
{ int slen;
slen=StrLength(s);
if ( i<1 || i>slen || len<0 || len>slen-i+1)
{ printf(?歌方音斤?); return 0; }
for (j=0; j<len; j++)
t[j]=s[i+j-1];
t[j]=’0円’;
return 1;
}
麻隈4.2
3?堪曳熟
int StrComp(char *s1, char *s2)
{ int i=0;
while (s1[i]==s2[i] && s1[i]!=’0円’) i++;
return (s1[i]-s2[i]);
}
麻隈4.3
4.2.3 庁塀謄塘
堪議庁塀謄塘軸徨堪協了頁匯嶽嶷勣議堪塰麻。譜s 才t 頁公協議曾倖堪?壓麼堪s嶄孀欺吉噐徨堪t 議狛殻各葎庁塀謄塘?泌惚壓s 嶄孀欺吉噐t 議徨堪?夸各謄塘撹孔?痕方卦指t 壓s 嶄議遍肝竃孖議贋刈了崔(賜會催)?倦夸謄塘払移?卦指-1。t 匆各葎庁塀。葎阻塰麻圭宴?譜忖憲堪議海業贋慧壓0 催汽圷?堪峙貫1 催汽圷贋慧?宸劔忖憲會催嚥贋刈了崔匯崑。
1?酒汽議庁塀謄塘麻隈
麻隈房?泌和?遍枠繍s1 嚥t1 序佩曳熟?飛音揖?祥繍s2 嚥t1 序佩曳熟?...?岷欺s議蝶匯倖忖憲si 才t1 屢揖?壅繍万断岻朔議忖憲序佩曳熟?飛匆屢揖?夸泌緩写偬吏和曳熟?輝s 議蝶匯倖忖憲si 嚥t 議忖憲tj 音揖扮?夸s 卦指欺云緬蝕兵忖憲議和匯倖忖憲?軸si-j+2?t 卦指欺t1?写偬蝕兵和匯緬議曳熟?嶷鹸貧峰狛殻。飛t 嶄議忖憲畠何曳頼?夸傍苧云緬謄塘撹孔?云緬議軟兵了崔頁i-j+1 賜i-t[0]?倦夸?謄塘払移。譜麼堪s=?ababcabcacbab??庁塀t=?abcac??謄塘狛殻泌夕4.3 侭幣。 卆象宸倖房??麻隈宙峰泌和:
int StrIndex_BF (char *s,char *t)
/*貫堪s 議及匯倖忖憲蝕兵孀遍肝嚥堪t 屢吉議徨堪*/
{ int i=1,j=1;
while (i<=s[0] && j<=t[0] ) /*脅短囑欺潤崩憲*/
if (s[i]==t[j])
{ i++;j++; } /*写偬*/
else
{i=i-j+2; j=1; } /*指翻*/
if (j>t[0]) return (i-t[0]); /*謄塘撹孔?卦指贋刈了崔*/
else return –1;
}
麻隈4.4
乎麻隈酒各葎BF 麻隈。和中蛍裂万議扮寂鹸墫業?譜堪s 海業葎n?堪t 海業葎m。謄塘撹孔議秤趨和?深打曾嶽自極秤趨?壓恷挫秤趨和?耽緬音撹孔議謄塘脅窟伏壓及匯斤忖憲曳熟扮?
箭泌?s=?aaaaaaaaaabc?
t=?bc?
譜謄塘撹孔窟伏壓si 侃?夸忖憲曳熟肝方壓念中i-1 緬謄塘嶄慌曳熟阻i-1 肝?及i 緬撹孔議謄塘慌曳熟阻m 肝?侭參悳慌曳熟阻i-1+m 肝?侭嗤謄塘撹孔議辛嬬慌嗤n-m+1嶽?譜貫si 蝕兵嚥t 堪謄塘撹孔議古楕葎pi?壓吉古楕秤趨和pi=1/(n-m+1)?咀緩恷挫秤趨和峠譲曳熟議肝方頁? 軸恷挫秤趨和議扮寂鹸墫業頁O(n+m)。壓恷撒秤趨和?耽緬音撹孔議謄塘脅窟伏壓t 議恷朔匯倖忖憲?
箭泌?s=?aaaaaaaaaaab?
t=?aaab?
譜謄塘撹孔窟伏壓si 侃?夸壓念中i-1 緬謄塘嶄慌曳熟阻(i-1)*m 肝?及i 緬撹孔議謄塘慌曳熟阻m 肝?侭參悳慌曳熟阻i*m 肝?咀緩恷撒挫秤趨和峠譲曳熟議肝方頁? 軸恷撒秤趨和議扮寂鹸墫業頁O(n*m)。
貧峰麻隈嶄謄塘頁貫s 堪議及匯倖忖憲蝕兵議?嗤扮麻隈勣箔貫峺協了崔蝕兵?宸扮麻隈議歌方燕嶄勣紗匯倖了崔歌方pos?StrIndex(shar *s,int pos,char *t)?曳熟議兜兵了崔協了壓pos 侃。麻隈4.4 頁pos=1 議秤趨。
2?個序朔議庁塀謄塘麻隈
BF 麻隈酒汽徽丼楕熟詰?匯嶽斤BF 麻隈恂阻載寄個序議庁塀謄塘麻隈頁針適蒙(Knuth)?暢戦帽(Morris)才噸性蒙(Pratt)揖扮譜柴議?酒各KMP 麻隈。
(1) KMP 麻隈議房?
蛍裂麻隈4.4 議峇佩狛殻, 夛撹BF 麻隈堀業蛸議圻咀頁指翻?軸壓蝶緬議謄塘狛殻払移朔?斤噐s 堪勣指欺云緬蝕兵忖憲議和匯倖忖憲?t 堪勣指欺及匯倖忖憲。遇宸乂指翻旺音頁駅勣議。泌夕4.3 侭幣議謄塘狛殻?壓及眉緬謄塘狛殻嶄?s3 ~ s6 才t1~ t4 頁謄塘撹孔議?s7≠t5 謄塘払移?咀緩嗤阻及膨緬?凪糞宸匯緬頁音駅勣議?喇夕辛心竃?咀葎壓及眉緬嶄嗤s4=t2?遇t 1≠t2?刃協嗤t1≠s4 。揖尖及励緬匆頁短嗤駅勣議?侭參貫及眉緬岻朔辛參岷俊欺及鎗緬?序匯化蛍裂及鎗緬嶄議及匯斤忖憲s 6 才t1 議曳熟匆頁謹噫議?咀葎及眉緬嶄厮将曳狛阻s6 才t4?旺拝s6=t4?遇t 1=t4?駅嗤s 6=t1?咀緩及鎗緬議曳熟辛參貫及屈斤忖憲s7 才t2 蝕兵序佩?宸祥頁傍?及眉緬謄塘払移朔?峺寞i 音強?遇頁繍庁塀堪t?嘔“錆強”?喘t2 “斤彈” s 7 写偬序佩?卆緩窃容。宸劔議侃尖圭隈峺寞i 頁涙指翻議。
忝貧侭峰?錬李蝶緬壓si 才tj 謄塘払移朔?峺寞i 音指翻?庁塀t ?嘔“錆強”崛蝶倖了崔貧?聞誼tk 斤彈s i 写偬?嘔序佩。?堡撮o嶬變別盖長惻軀粘?t“錆強”欺陳倖了崔貧?音形譜了崔葎k?軸si 才tj 謄塘払移朔?峺寞i 音強?庁塀t ?嘔“錆強”?聞tk 才si斤彈写偬?嘔序佩曳熟?勣諾怎宸匯邪譜?祥勣嗤泌和購狼撹羨?
?t1 t2 … tk-1 ? =?si-k+1 si-k+2 … si-1 ? (4.1)
(4.1)塀恣円頁tk 念中議k-1 倖忖憲?嘔円頁si 念中議k-1 倖忖憲。遇云緬謄塘払移頁壓si 才tj 岻侃?厮将誼欺議何蛍謄塘潤惚頁?
?t1 t2 … tj-1 ? =?si-j+1 si-j+2 … si-1 ? (4.2)
咀葎k<j?侭參嗤?
?tj-k+1 tj-k+2 … tj-1 ? =?si-k+1 si-k+2 … si-1 ? (4.3)
(4.3)塀恣円頁tj 念中議k-1 倖忖憲?嘔円頁si 念中議k-1 倖忖憲?宥狛(4.1)才(4.3)誼欺購狼?
?t1 t2 … tk-1 ? =?tj-k+1 tj-k+2 … tj-1 ? (4.4)
潤胎?蝶緬壓si 才tj 謄塘払移朔?泌惚庁塀堪嶄嗤諾怎購狼(4)議徨堪贋壓?軸?庁塀嶄議念k-1 倖忖憲嚥庁塀嶄tj 忖憲念中議k-1 倖忖憲屢吉扮?庁塀t 祥辛參?嘔“錆強”崛聞tk 才si 斤彈?写偬?嘔序佩曳熟軸辛。
?2?next 痕方
庁塀嶄議耽匯倖tj 脅斤哘匯倖k 峙?喇(4.4)塀辛岑?宸倖k 峙叙卆正嚥庁塀t 云附忖憲會双議更撹?遇嚥麼堪s 涙購。厘断喘next[j]燕幣tj 斤哘議k 峙?功象參貧蛍裂?next痕方嗤泌和來嵎?
? next[j]頁匯倖屁方?拝0≤next[j]<j
? 葎阻聞t 議嘔卞音卿払販採謄塘撹孔議辛嬬?輝贋壓謹倖諾怎(4.4)塀議k 峙扮?哘函恷寄議?宸劔?嘔“錆強”議鉦宣恷玉?“錆強”議忖憲葎j-next[j]倖。
? 泌惚壓tj 念音贋壓諾怎(4.4)塀議徨堪?緩扮飛t1≠tj?夸k=1; 飛t1=tj?夸k=0; 宸扮“錆強”議恷垓?葎j-1 倖忖憲軸喘t1 才sj+1 写偬曳熟。
咀緩?next 痕方協吶泌和?
(3) KMP 麻隈
壓箔誼庁塀議next 痕方岻朔?謄塘辛泌和序佩?邪譜參峺寞i 才j 蛍艶峺幣麼堪才庁塀嶄議曳熟忖憲?綜i 議兜峙葎pos?j 議兜峙葎1。飛壓謄塘狛殻嶄si≠tj?夸i 才j 蛍艶奐1?飛si≠tj 謄塘払移朔?夸i 音延?j 曜欺next[j]了崔壅曳熟?飛屢吉?夸峺寞光徭奐1?倦夸j 壅曜欺和匯倖next 峙議了崔?卆緩窃容。岷崛和双曾嶽秤趨?匯嶽頁j 曜欺蝶倖next峙扮忖憲曳熟屢吉?夸i 才j 蛍艶奐1写偬序佩謄塘; 総匯嶽頁j 曜欺峙葎巣?軸庁塀議及匯倖忖憲払塘??夸緩扮i 才j 匆勣蛍艶奐1?燕苧貫麼堪議和匯倖忖憲軟才庁塀嶷仟蝕兵謄塘。
譜麼堪s=?acabaabaabcacaabc??徨堪t=?abaabcac??夕4.4 頁匯倖旋喘next 痕方序佩謄塘議狛殻幣吭夕。壓邪譜厮嗤next 痕方秤趨和?KMP 麻隈泌和?
int StrIndex_KMP(char *s,char *t,int pos)
/*貫堪s 議及pos 倖忖憲蝕兵孀遍肝嚥堪t 屢吉議徨堪*/
{ int i=pos,j=1,slen,tlen;
while (i<=s[0] && j<=t[0] ) /*脅短囑欺潤崩憲*/
if (j==0||s[i]==t[j]) { i++; j++; }
else j=next[j]; /*指翻*/
if (j>t[0]) return i-t[0]; /*謄塘撹孔?卦指贋刈了崔*/
else return –1;
}
麻隈4.5
(4)泌採箔next 痕方
喇參貧網胎岑?next 痕方峙叙函畳噐庁塀云附遇才麼堪涙購。厘断辛參貫蛍裂next 痕方議協吶竃窟喘弓容議圭隈箔誼next 痕方峙。喇協吶岑?
next[1]=0 (4.5)
譜next[j]=k?軸嗤?
?t1 t2 … tk-1 ? =?tj-k+1 tj-k+2 … tj-1 ? (4.6)
next[j+1]=? 辛嬬嗤曾嶽秤趨?及匯嶽秤趨?飛tk ?tj 夸燕苧壓庁塀堪嶄
?t1 t2 … tk ? =?tj-k+1 tj-k+2 … tj ? (4.7)
宸祥頁傍next[j+1]=k+1?軸
next[j?1]=next[j]+1 (4.8)
及屈嶽秤趨?飛tk ≠tj 夸燕苧壓庁塀堪嶄
?t1 t2 … tk ?≠?tj-k+1 tj-k+2 … tj ? (4.9)
緩扮辛委箔next 痕方峙議諒籾心撹頁匯倖庁塀謄塘諒籾?屁倖庁塀堪屡頁麼堪嗽頁庁塀?遇輝念壓謄塘議狛殻嶄?厮嗤(4.6)塀撹羨?夸輝tk ≠tj 扮哘繍庁塀?嘔錆強?聞誼及next[k]倖忖憲才“麼堪”嶄議及j 倖忖憲屢曳熟。飛next[k]=k′?拝t k′?tj?夸傍苧壓麼堪嶄及j+1 倖忖憲岻念贋壓匯倖恷寄海業葎k′議徨堪?聞誼
?t1 t2 … t k′ ?=?tj-k′+1 tj- k′+2 … tj ? (4.10)
咀緩? next[j+1]=next[k]+1 (4.11)
揖尖飛t k′ ≠tj?夸繍庁塀写偬?嘔錆強崛聞及next[k′]倖忖憲才tj 斤馴?卆緩窃容?岷崛tj 才庁塀嶄議蝶倖忖憲謄塘撹孔賜宀音贋壓販採k′(1< k′<k <…<j)諾怎(4.10)?緩扮飛t1≠tj+1 ? 夸嗤?next[j+1]=1 (4.12)
倦夸飛t1=tj+1 ?夸嗤?next[j+1]=0 (4.13)
忝貧侭峰?箔next 痕方峙狛殻議麻隈泌和?
void GetNext(char *t,int next[ ])
/*箔庁塀t 議next 峙旺雁秘next 方怏嶄*/
? int i=1,j=0;
next[1]=0;
while (i<t[0])
{ while (j>0&&t[i]!=t[j]) j=next[j];
i++; j++;
if (t[i]==t[j]) next[i]=next[j];
else next[i]=j;
}
}
麻隈4.6
麻隈4.6 議扮寂鹸墫業頁O(m)?侭參麻隈4.5 議扮寂鹸墫業頁O(n*m)?徽壓匯違秤趨和?糞縞議峇佩扮寂頁O(n+m)。輝隼KMP 麻隈才酒汽議庁塀謄塘麻隈屢曳?奐紗阻載寄佃業?厘断麼勣僥楼乎麻隈議譜柴室派。