锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浠g爜濡備笅錛?br>
unsigned char reverseChar(unsigned char c)
2{
3 c=(c&0x55)<<1 | (c&0xAA)>>1;
4 c=(c&0x33)<<2 | (c&0xCC)>>2;
5 c=(c&0x0F)<<4 | (c&0xF0)>>4;
6 return c;
7}
8
瑙i噴錛氱3琛屽姛鑳藉皢abcd efgh鍙樹(shù)負(fù)badc fehg錛岀4琛屽姛鑳藉皢badc fehg鍙樹(shù)負(fù)dcba hgfe錛岀5琛屽姛鑳藉皢dcba hgfe鍙樹(shù)負(fù)hgfe dcba錛孫K!
鎬濇兂綾諱技“蹇熻綆楁暣鏁扮殑浜岃繘鍒惰〃紺轟腑鍚?鐨勪釜鏁?/u>”錛岄噰鐢ㄥ綊騫舵柟娉曘?
]]>
絎竴縐嶇畻娉曪細(xì)
涓婇潰綆楁硶鐨勬椂闂村鏉傚害灝辨槸1鐨勪釜鏁般?br>
絎簩縐嶇畻娉曪紙鏌ヨ〃娉曪級(jí)錛?br>
涓婇潰綆楁硶鏈澶氬彧闇瑕?嬈″驚鐜紝鐢ㄧ┖闂存崲鍙栨椂闂淬?br>
絎簩縐嶇畻娉曠殑鍙︿竴縐嶅艦寮忥細(xì)
絎笁縐嶇畻娉曪細(xì)
瑙i噴錛氭瘮濡傚浜庝竴涓?浣嶇殑鏁存暟122錛岀敤浜岃繘鍒惰〃杈?span style="COLOR: #ff00ff">0111 1010錛坅bcd efgh錛夛紝絎?琛屼唬鐮佺殑鍔熻兘鏄痻=0b0d 0f0h+0a0c 0e0g錛屼袱浣嶄竴緇勶紝鍒嗗埆璁$畻鍥涚粍錛坅,b; c,d; e,f; g,h; 錛変腑1鐨勪釜鏁幫紝鏈緥涓瓁=0101 0000+0001 0101=0110 0101錛堟洿鏂扮殑abcd efgh錛夛紝鍦ㄦ鍩虹涓婏紝鍐嶅垎緇勶紝灝辨槸絎簩琛岀殑鍔熻兘x=00cd 00gh+00ab 00ef錛屽洓浣嶄竴緇勶紙abcd錛?efgh錛夛紝鍒嗗埆璁$畻榪欎袱緇勫寘鍚?鐨勪釜鏁幫紝鏈緥涓瓁=0010 0001+0001 0001=0011 0010錛堟洿鏂癮bcd efgh錛夛紝鍐?浣嶄竴緇勶紝濡傜涓夎鎵紺猴紝x=0000 efgh+0000abcd=0000 0010+0000 0011=0000 0101=5錛屾墍浠ヨ鏁存暟122鍏卞寘鍚?涓?銆?br>
鏈畻娉曟濇兂錛氬綊騫訛紝瀵逛簬涓涓?2浣嶇殑鏁存暟錛屽厛鍒嗘垚16緇勶紝緇熻姣忕粍錛?浣嶏級(jí)涓?鐨勪釜鏁幫紝鍐嶅皢緇熻鐨勭粨鏋滀袱涓ゅ悎騫訛紝寰楀埌8緇勶紝鍦ㄦ鍩虹涓婂張鍚堝茍寰楀埌4緇勶紝2緇勶紝1緇勶紝榪涜屽緱鍒版渶緇堢粨鏋溿?br>
榪欑鐢盌.E.Knuth,J.H.Morris鍜孷.R.Pratt鍚屾椂鍙戠幇鐨勬敼榪涚殑妯″紡鍖歸厤綆楁硶綆縐頒負(fù)KMP綆楁硶銆傚ぇ姒傚榪囦俊鎭鐨勯兘鐭ラ亾錛屾槸涓瘮杈冮毦鐞嗚В鐨勭畻娉曪紝浠婂ぉ鐗規(guī)妸瀹冩悶涓交褰誨簳搴曟槑鏄庣櫧鐧姐?/p>
娉ㄦ剰鍒拌繖鏄竴涓敼榪涚殑綆楁硶錛屾墍浠ユ湁蹇呰鎶婂師鏉ョ殑妯″紡鍖歸厤綆楁硶鎷垮嚭鏉ワ紝鍏跺疄鐞嗚В鐨勫叧閿氨鍦ㄨ繖閲岋紝涓鑸殑鍖歸厤綆楁硶錛?/p>
int Index(String S,String T,int pos)//鍙傝冦婃暟鎹粨鏋勩嬩腑鐨勭▼搴?br>{
i=pos;j=1;//榪欓噷鐨勪覆鐨勭1涓厓绱犱笅鏍囨槸1
while(i<=S.Length && j<=T.Length)
{
if(S[i]==T[j]){++i;++j;}
else{i=i-j+2;j=1;}//**************(1)
}
if(j>T.Length) return i-T.Length;//鍖歸厤鎴愬姛
else return 0;
}
鍖歸厤鐨勮繃紼嬮潪甯告竻鏅幫紝鍏抽敭鏄綋‘澶遍厤’鐨勬椂鍊欑▼搴忔槸濡備綍澶勭悊鐨勶紵鍥炴函錛屾病閿欙紝娉ㄦ剰鍒?1)鍙ワ紝涓轟粈涔堣鍥炴函錛岀湅涓嬮潰鐨勪緥瀛愶細(xì)
S:aaaaabababcaaa T:ababc
aaaaabababcaaa
ababc.(.琛ㄧず鍓嶄竴涓凡緇忓け閰?
鍥炴函鐨勭粨鏋滃氨鏄?br>aaaaabababcaaa
a.(babc)
濡傛灉涓嶅洖婧氨鏄?br>aaaaabababcaaa
aba.bc
榪欐牱灝辨紡浜?jiǎn)涓涓彲鑳藉尮閰嶆垚鍔熺殑鎯呭喌
aaaaabababcaaa
ababc
涓轟粈涔堜細(xì)鍙戠敓榪欐牱鐨勬儏鍐碉紵榪欐槸鐢盩涓叉湰韜殑鎬ц川鍐沖畾鐨勶紝鏄洜涓篢涓叉湰韜湁鍓嶅悗'閮ㄥ垎鍖歸厤'鐨勬ц川銆傚鏋淭涓篴bcdef榪欐牱鐨勶紝澶ф病鏈夊洖婧殑蹇呰銆?/p>
鏀硅繘鐨勫湴鏂逛篃灝辨槸榪欓噷錛屾垜浠粠T涓叉湰韜嚭鍙戯紝浜嬪厛灝辨壘鍑嗕簡(jiǎn)T鑷韓鍓嶅悗閮ㄥ垎鍖歸厤鐨勪綅緗紝閭e氨鍙互鏀硅繘綆楁硶銆?/p>
濡傛灉涓嶇敤鍥炴函錛岄偅T涓蹭笅涓涓綅緗粠鍝噷寮濮嬪憿錛?/p>
榪樻槸涓婇潰閭d釜渚嬪瓙錛孴涓篴babc錛屽鏋渃澶遍厤錛岄偅灝卞彲浠ュ線(xiàn)鍓嶇Щ鍒癮ba鏈鍚庝竴涓猘鐨勪綅緗紝鍍忚繖鏍鳳細(xì)
...ababd...
ababc
->ababc
榪欐牱i涓嶇敤鍥炴函錛宩璺沖埌鍓?涓綅緗紝緇х畫(huà)鍖歸厤鐨勮繃紼嬶紝榪欏氨鏄疜MP綆楁硶鎵鍦ㄣ傝繖涓綋T[j]澶遍厤鍚庯紝j搴旇寰(xiàn)鍓嶈煩鐨勫煎氨鏄痡鐨刵ext鍊鹼紝瀹冩槸鐢盩涓叉湰韜浐鏈夊喅瀹氱殑錛屼笌S涓叉棤鍏熾?/p>
銆婃暟鎹粨鏋勩嬩笂緇欎簡(jiǎn)next鍊肩殑瀹氫箟錛?br> 0 濡傛灉j=1
next[j]={Max{k|1<k<j涓?p1...pk-1'='pj-k+1...pj-1'
1 鍏跺畠鎯呭喌
鎴戝綋鍒濈湅鍒拌繖涓ご灝辨檿浜?jiǎn)锛屽叾瀹炲畠灏辨槸鎻彉q扮殑鎴戝墠闈㈣〃榪扮殑鎯呭喌錛屽叧浜巒ext[1]=0鏄瀹氱殑錛岃繖鏍瘋瀹氬彲浠ヤ嬌紼嬪簭綆鍗曚竴浜涳紝濡傛灉闈炶瀹氫負(fù)鍏跺畠鐨勫煎彧瑕佷笉鍜屽悗闈㈢殑鍊煎啿紿佷篃鏄彲浠ョ殑錛涜岄偅涓狹ax鏄粈涔堟剰鎬濓紝涓句釜渚嬪瓙錛?/p>
T:aaab
...aaaab...
aaab
->aaab
->aaab
->aaab
鍍忚繖鏍風(fēng)殑T錛屽墠闈㈣嚜韜儴鍒嗗尮閰嶇殑閮ㄥ垎涓嶆涓や釜錛岄偅搴旇寰(xiàn)鍓嶈煩鍒扮鍑犱釜鍛紵鏈榪戠殑涓涓紝涔熷氨鏄灝藉彲鑳界殑鍚戝彸婊戠Щ鏈鐭殑闀垮害銆?/p>
OK錛屼簡(jiǎn)瑙e埌榪欓噷錛屽氨鐪嬫竻浜?jiǎn)KMP鐨勫ぇ閮ㄥ垎鍐呭錛岀劧鍚庡叧閿殑闂鏄浣曟眰next鍊鹼紵鍏堜笉綆″畠錛屽厛鐪嬪浣曠敤瀹冩潵榪涜鍖歸厤鎿嶄綔錛屼篃灝辨槸璇村厛鍋囪宸茬粡鏈変簡(jiǎn)next鍊箋?/p>
灝嗘渶鍓嶉潰鐨勭▼搴忔敼鍐欐垚錛?/p>
int Index_KMP(String S,String T,int pos)
{
i=pos;j=1;//榪欓噷鐨勪覆鐨勭1涓厓绱犱笅鏍囨槸1
while(i<=S.Length && j<=T.Length)
{
if(j==0 || S[i]==T[j]){++i;++j;} //娉ㄦ剰鍒拌繖閲岀殑j==0,鍜?+j鐨勪綔鐢ㄥ氨鐭ラ亾涓轟粈涔堣瀹歯ext[1]=0鐨勫ソ澶勪簡(jiǎn)
else j=next[j];//i涓嶅彉錛堜笉鍥炴函錛?j璺沖姩
}
if(j>T.Length) return i-T.Length;//鍖歸厤鎴愬姛
else return 0;
}
OK,鏄笉鏄潪甯哥畝鍗曪紵榪樻湁鏇寸畝鍗曠殑錛屾眰next鍊鹼紝榪欎篃鏄暣涓畻娉曟垚鍔熺殑鍏抽敭錛屼粠next鍊肩殑瀹氫箟鏉ユ眰澶亹鎬栦簡(jiǎn)錛屾庝箞姹傦紵鍓嶉潰璇磋繃浜?jiǎn)锛宯ext鍊艱〃杈劇殑灝辨槸T涓茬殑鑷韓閮ㄥ垎鍖歸厤鐨勬ц川錛岄偅涔堬紝鎴戝彧瑕佸皢T涓插拰T涓茶嚜韜潵涓嬈″尮閰嶅氨鍙互姹傚嚭鏉ヤ簡(jiǎn)錛岃繖閲岀殑鍖歸厤榪囩▼涓嶆槸浠庡ご涓涓竴涓尮閰嶏紝鑰屾槸浠嶵[1]鍜孴[2]寮濮嬪尮閰嶏紝緇欏嚭綆楁硶濡備笅錛?/p>
void get_next(String T,int &next[])
{
i=1;j=0;next[1]=0;
while(i<=T.Length)
{
if(j==0 || T[i]==T[j]){++i;++j; next[i]=j;/**********(2)*/}
else j=next[j];
}
}
鐪嬭繖涓嚱鏁版槸涓嶆槸闈炲父鍍廗MP鍖歸厤鐨勫嚱鏁幫紝娌¢敊錛屽畠?yōu)鏄瘶q欎箞騫茬殑錛佹敞鎰忓埌(2)璇彞閫昏緫瑕嗙洊鐨勬椂鍊欐槸T[i]==T[j]浠ュ強(qiáng)i鍓嶉潰鐨勩乯鍓嶉潰鐨勯兘鍖歸厤鐨勬儏鍐典笅錛屼簬鏄厛鑷錛岀劧鍚庤涓嬫潵next[i]=j錛岃繖鏍鋒瘡褰搃鏈夎嚜澧炲氨浼?xì)姹傚緱涓涓猲ext[i]錛岃宩涓瀹氫細(xì)灝忎簬絳変簬i錛屼簬鏄浜庡凡緇忔眰鍑烘潵鐨刵ext錛屽彲浠ョ戶(hù)緇眰鍚庨潰鐨刵ext錛岃宯ext[1]=0鏄凡鐭ワ紝鎵浠ユ暣涓氨榪欐牱閫掓帹鐨勬眰鍑烘潵浜?jiǎn)锛屾栆?guī)硶闈炲父宸у銆?/p>
榪欐牱鐨勬敼榪涘凡緇忔槸寰堜笉閿欎簡(jiǎn)錛屼絾綆楁硶榪樺彲浠ユ敼榪涳紝娉ㄦ剰鍒頒笅闈㈢殑鍖歸厤鎯呭喌錛?/p>
...aaac...
aaaa.
T涓蹭腑鐨?a'鍜孲涓蹭腑鐨?c'澶遍厤錛岃?a'鐨刵ext鍊兼寚鐨勮繕鏄?a'錛岄偅鍚屾牱鐨勬瘮杈冭繕鏄細(xì)澶遍厤錛岃岃繖鏍風(fēng)殑姣旇緝鏄浣欑殑錛屽鏋滄垜浜嬪厛鐭ラ亾錛屽綋T[i]==T[j]錛岄偅next[i]灝辮涓簄ext[j]錛屽湪姹俷ext鍊肩殑鏃跺欏氨宸茬粡姣旇緝浜?jiǎn)锛寴q欐牱灝卞彲浠ュ幓鎺夎繖鏍風(fēng)殑澶氫綑鐨勬瘮杈冦備簬鏄◢鍔犳敼榪涘緱鍒幫細(xì)
void get_nextval(String T,int &next[])
{
i=1;j=0;next[1]=0;
while(i<=T.Length)
{
if(j==0 || T[i]==T[j])
{ ++i;++j;
if(T[i]!=T[j]) next[i]=j;
else next[i]=next[j];//娑堝幓澶氫綑鐨勫彲鑳界殑姣旇緝,next鍐嶅悜鍓嶈煩
}
else j=next[j];
}
}
鍖歸厤綆楁硶涓嶅彉銆?/p>
鍒版灝卞畬鍏ㄥ紕娓呮浜?jiǎn)锛屼互鍓嶈佽寰桲MP綆楁硶濂界縐橈紝鐪熶笉鏄漢鎯沖嚭鏉ョ殑錛屽叾瀹炰笉鐒?dòng)灱屽畠鍙笉杩囨槸瀵瑰師鏈夌殑绠楁硶杩涜浜?jiǎn)鏀硅繘銆傚彲瑙佸熀紜鐨勭粡鍏哥殑涓滆タ榪樻槸寰堥噸瑕侊紝浣犳湁鏈簨‘搴?#8217;浜?jiǎn)缁忓吀锛尀鍒涢犱簡(jiǎn)榪涙銆?/p>